Treat null path as non-matching pattern in AntPathMatcher

Prior to this commit, a null path supplied to the isPattern(), match(),
and matchStart() methods in AntPathMatcher resulted in a
NullPointerException.

This commit addresses this by treating a `null` path as a non-matching
pattern.

Closes gh-23297
This commit is contained in:
Scheidter,Ryan 2019-07-16 08:06:02 -05:00 committed by Sam Brannen
parent 639a254e0d
commit 84200f3141
3 changed files with 46 additions and 1 deletions

View File

@ -169,6 +169,9 @@ public class AntPathMatcher implements PathMatcher {
@Override
public boolean isPattern(String path) {
if(path == null) {
return false;
}
boolean uriVar = false;
for (int i = 0; i < path.length(); i++) {
char c = path.charAt(i);
@ -207,7 +210,7 @@ public class AntPathMatcher implements PathMatcher {
protected boolean doMatch(String pattern, String path, boolean fullMatch,
@Nullable Map<String, String> uriTemplateVariables) {
if (path.startsWith(this.pathSeparator) != pattern.startsWith(this.pathSeparator)) {
if (path == null || path.startsWith(this.pathSeparator) != pattern.startsWith(this.pathSeparator)) {
return false;
}

View File

@ -130,6 +130,11 @@ public class AntPathMatcherTests {
assertThat(pathMatcher.match("", "")).isTrue();
assertThat(pathMatcher.match("/{bla}.*", "/testing.html")).isTrue();
assertThat(pathMatcher.match("/test", null)).isFalse();
assertThat(pathMatcher.match("/", null)).isFalse();
assertThat(pathMatcher.match("/", null)).isFalse();
assertThat(pathMatcher.match(null, null)).isFalse();
}
// SPR-14247
@ -688,6 +693,7 @@ public class AntPathMatcherTests {
assertThat(pathMatcher.isPattern("/test/{name}")).isTrue();
assertThat(pathMatcher.isPattern("/test/name")).isFalse();
assertThat(pathMatcher.isPattern("/test/foo{bar")).isFalse();
assertThat(pathMatcher.isPattern(null)).isFalse();
}
}

View File

@ -42,6 +42,18 @@ public class MockMvcResultMatchersTests {
redirectedUrl("/resource/1").match(getRedirectedUrlStubMvcResult("/resource/1"));
}
@Test
public void redirectNonMatching() {
assertThatExceptionOfType(AssertionError.class).isThrownBy(() ->
redirectedUrl("/resource/2").match(getRedirectedUrlStubMvcResult("/resource/1")));
}
@Test
public void redirectNonMatchingBecauseNotRedirect() {
assertThatExceptionOfType(AssertionError.class).isThrownBy(() ->
redirectedUrl("/resource/1").match(getForwardedUrlStubMvcResult("/resource/1")));
}
@Test
public void redirectWithUrlTemplate() throws Exception {
redirectedUrlTemplate("/orders/{orderId}/items/{itemId}", 1, 2).match(getRedirectedUrlStubMvcResult("/orders/1/items/2"));
@ -58,11 +70,29 @@ public class MockMvcResultMatchersTests {
redirectedUrlPattern("/resource/").match(getRedirectedUrlStubMvcResult("/resource/1")));
}
@Test
public void redirectWithNonMatchingPatternBecauseNotRedirect() {
assertThatExceptionOfType(AssertionError.class).isThrownBy(() ->
redirectedUrlPattern("/resource/*").match(getForwardedUrlStubMvcResult("/resource/1")));
}
@Test
public void forward() throws Exception {
forwardedUrl("/api/resource/1").match(getForwardedUrlStubMvcResult("/api/resource/1"));
}
@Test
public void forwardNonMatching() {
assertThatExceptionOfType(AssertionError.class).isThrownBy(() ->
forwardedUrlPattern("api/resource/2").match(getForwardedUrlStubMvcResult("api/resource/1")));
}
@Test
public void forwardNonMatchingBecauseNotForward() {
assertThatExceptionOfType(AssertionError.class).isThrownBy(() ->
forwardedUrlPattern("api/resource/1").match(getRedirectedUrlStubMvcResult("api/resource/1")));
}
@Test
public void forwardWithQueryString() throws Exception {
forwardedUrl("/api/resource/1?arg=value").match(getForwardedUrlStubMvcResult("/api/resource/1?arg=value"));
@ -84,6 +114,12 @@ public class MockMvcResultMatchersTests {
forwardedUrlPattern("/resource/").match(getForwardedUrlStubMvcResult("/resource/1")));
}
@Test
public void forwardWithNonMatchingPatternBecauseNotForward() {
assertThatExceptionOfType(AssertionError.class).isThrownBy(() ->
forwardedUrlPattern("/resource/*").match(getRedirectedUrlStubMvcResult("/resource/1")));
}
private StubMvcResult getRedirectedUrlStubMvcResult(String redirectUrl) throws Exception {
MockHttpServletResponse response = new MockHttpServletResponse();
response.sendRedirect(redirectUrl);