From 0856e10443c2ca4f977b0fb0dee457415e38fe54 Mon Sep 17 00:00:00 2001 From: Phillip Webb Date: Thu, 23 Nov 2023 14:35:04 -0800 Subject: [PATCH] Fix IndexOutOfBoundsException exception from parseUrl with empty spec Update jar `Handler` code so that the `parseUrl` method can accept an empty `spec`. Prior to this commit, a `classLoader.getResource("")` call would result in a `null` result. This breaks a number of things including `ClassPathResource` and `PathMatchingResourcePatternResolver`. Fixes gh-38524 --- .../boot/loader/net/protocol/jar/Handler.java | 2 +- .../boot/loader/net/protocol/jar/HandlerTests.java | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/spring-boot-project/spring-boot-tools/spring-boot-loader/src/main/java/org/springframework/boot/loader/net/protocol/jar/Handler.java b/spring-boot-project/spring-boot-tools/spring-boot-loader/src/main/java/org/springframework/boot/loader/net/protocol/jar/Handler.java index 2778beeccaf..facc6fe6a5d 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-loader/src/main/java/org/springframework/boot/loader/net/protocol/jar/Handler.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-loader/src/main/java/org/springframework/boot/loader/net/protocol/jar/Handler.java @@ -89,7 +89,7 @@ public class Handler extends URLStreamHandler { private String extractContextPath(URL url, String spec, int start) { String contextPath = url.getPath(); - if (spec.charAt(start) == '/') { + if (spec.regionMatches(false, start, "/", 0, 1)) { int indexOfContextPathSeparator = indexOfSeparator(contextPath); if (indexOfContextPathSeparator == -1) { throw new IllegalStateException("malformed context url:%s: no !/".formatted(url)); diff --git a/spring-boot-project/spring-boot-tools/spring-boot-loader/src/test/java/org/springframework/boot/loader/net/protocol/jar/HandlerTests.java b/spring-boot-project/spring-boot-tools/spring-boot-loader/src/test/java/org/springframework/boot/loader/net/protocol/jar/HandlerTests.java index 8d695721158..6e825480522 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-loader/src/test/java/org/springframework/boot/loader/net/protocol/jar/HandlerTests.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-loader/src/test/java/org/springframework/boot/loader/net/protocol/jar/HandlerTests.java @@ -142,6 +142,15 @@ class HandlerTests { assertThat(url.toExternalForm()).isEqualTo("jar:file:example.jar!/entry.txt#runtime"); } + @Test // gh-38524 + void parseUrlWhenSpecIsEmpty() throws MalformedURLException { + URL url = createJarUrl("nested:gh-38524.jar/!BOOT-INF/classes/!/"); + String spec = ""; + this.handler.parseURL(url, spec, 0, 0); + assertThat(url.toExternalForm()).isEqualTo("jar:nested:gh-38524.jar/!BOOT-INF/classes/!/"); + + } + @Test void hashCodeGeneratesHashCode() throws MalformedURLException { URL url = createJarUrl("file:example.jar!/entry.txt");