diff --git a/spring-web/src/main/java/org/springframework/web/util/pattern/InternalPathPatternParser.java b/spring-web/src/main/java/org/springframework/web/util/pattern/InternalPathPatternParser.java index 7011545ed3f..3906e72bd59 100644 --- a/spring-web/src/main/java/org/springframework/web/util/pattern/InternalPathPatternParser.java +++ b/spring-web/src/main/java/org/springframework/web/util/pattern/InternalPathPatternParser.java @@ -234,14 +234,22 @@ class InternalPathPatternParser { } private boolean isDoubleWildcard(char separator) { + // next char is present if ((this.pos + 1) >= this.pathPatternLength) { return false; } + // current char and next char are '*' if (this.pathPatternData[this.pos] != '*' || this.pathPatternData[this.pos + 1] != '*') { return false; } - if ((this.pos + 2) < this.pathPatternLength) { - return this.pathPatternData[this.pos + 2] == separator; + // previous char is a separator, if any + if ((this.pos - 1 >= 0) && (this.pathPatternData[this.pos - 1] != separator)) { + return false; + } + // next char is a separator, if any + if (((this.pos + 2) < this.pathPatternLength) && + this.pathPatternData[this.pos + 2] != separator) { + return false; } return true; } diff --git a/spring-web/src/test/java/org/springframework/web/util/pattern/PathPatternParserTests.java b/spring-web/src/test/java/org/springframework/web/util/pattern/PathPatternParserTests.java index 99c3db01549..e70fe5e8328 100644 --- a/spring-web/src/test/java/org/springframework/web/util/pattern/PathPatternParserTests.java +++ b/spring-web/src/test/java/org/springframework/web/util/pattern/PathPatternParserTests.java @@ -85,9 +85,14 @@ class PathPatternParserTests { @Test void regexpSegmentIsNotWildcardSegment() { - // this is not double wildcard, it's / then **acb (an odd, unnecessary use of double *) pathPattern = checkStructure("/**acb"); assertPathElements(pathPattern, SeparatorPathElement.class, RegexPathElement.class); + + pathPattern = checkStructure("/a**bc"); + assertPathElements(pathPattern, SeparatorPathElement.class, RegexPathElement.class); + + pathPattern = checkStructure("/abc**"); + assertPathElements(pathPattern, SeparatorPathElement.class, RegexPathElement.class); } @Test