diff --git a/loader/spring-boot-loader/src/main/java/org/springframework/boot/loader/jar/NestedJarFile.java b/loader/spring-boot-loader/src/main/java/org/springframework/boot/loader/jar/NestedJarFile.java index e12cc4c3efc..8e1f96b5e63 100644 --- a/loader/spring-boot-loader/src/main/java/org/springframework/boot/loader/jar/NestedJarFile.java +++ b/loader/spring-boot-loader/src/main/java/org/springframework/boot/loader/jar/NestedJarFile.java @@ -706,6 +706,7 @@ public class NestedJarFile extends JarFile { JarEntryInputStream(ZipContent.Entry entry) throws IOException { this.uncompressedSize = entry.getUncompressedSize(); this.content = entry.openContent(); + this.remaining = this.uncompressedSize; } @Override @@ -727,9 +728,6 @@ public class NestedJarFile extends JarFile { } result = count; } - if (this.remaining == 0) { - close(); - } return result; } @@ -741,9 +739,6 @@ public class NestedJarFile extends JarFile { this.pos += result; this.remaining -= result; } - if (this.remaining == 0) { - close(); - } return result; } diff --git a/loader/spring-boot-loader/src/test/java/org/springframework/boot/loader/jar/NestedJarFileTests.java b/loader/spring-boot-loader/src/test/java/org/springframework/boot/loader/jar/NestedJarFileTests.java index 989f2148dfb..fc35d91c690 100644 --- a/loader/spring-boot-loader/src/test/java/org/springframework/boot/loader/jar/NestedJarFileTests.java +++ b/loader/spring-boot-loader/src/test/java/org/springframework/boot/loader/jar/NestedJarFileTests.java @@ -431,6 +431,56 @@ class NestedJarFileTests { .hasMessage("Content mismatch when reading security info for entry 'content' (content check)"); } + @Test + void readingToEndOfStoredContentCausesAvailableToReachZero() throws IOException { + try (NestedJarFile jar = new NestedJarFile(this.file)) { + JarEntry entry = jar.getEntry("nested.jar"); + try (InputStream input = jar.getInputStream(entry)) { + assertThat(input.available()).isGreaterThan(0); + StreamUtils.copyToByteArray(input); + assertThat(input.available()).isZero(); + } + } + } + + @Test + void readingToEndOfDeflatedContentCausesAvailableToReachZero() throws IOException { + try (NestedJarFile jar = new NestedJarFile(this.file)) { + JarEntry entry = jar.getEntry("d/9.dat"); + try (InputStream input = jar.getInputStream(entry)) { + assertThat(input.available()).isGreaterThan(0); + StreamUtils.copyToByteArray(input); + assertThat(input.available()).isZero(); + } + } + } + + @Test + void skippingBeyondEndOfStoredContentCausesAvailableToReachZero() throws IOException { + try (NestedJarFile jar = new NestedJarFile(this.file)) { + JarEntry entry = jar.getEntry("nested.jar"); + try (InputStream input = jar.getInputStream(entry)) { + assertThat(input.available()).isGreaterThan(0); + long skipped = input.skip(1000); + assertThat(skipped).isLessThan(1000); + assertThat(input.available()).isZero(); + } + } + } + + @Test + void skippingBeyondEndOfDeflatedContentCausesAvailableToReachZero() throws IOException { + try (NestedJarFile jar = new NestedJarFile(this.file)) { + JarEntry entry = jar.getEntry("d/9.dat"); + try (InputStream input = jar.getInputStream(entry)) { + assertThat(input.available()).isGreaterThan(0); + long skipped = input.skip(1000); + assertThat(skipped).isLessThan(1000); + assertThat(input.available()).isZero(); + } + } + } + private List collectComments(JarFile jarFile) throws IOException { try (jarFile) { List comments = new ArrayList<>();