diff --git a/spring-boot-project/spring-boot-tools/spring-boot-loader/src/main/java/org/springframework/boot/loader/zip/ZipCentralDirectoryFileHeaderRecord.java b/spring-boot-project/spring-boot-tools/spring-boot-loader/src/main/java/org/springframework/boot/loader/zip/ZipCentralDirectoryFileHeaderRecord.java index a9ca0a54ad8..673620f155b 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-loader/src/main/java/org/springframework/boot/loader/zip/ZipCentralDirectoryFileHeaderRecord.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-loader/src/main/java/org/springframework/boot/loader/zip/ZipCentralDirectoryFileHeaderRecord.java @@ -97,8 +97,8 @@ record ZipCentralDirectoryFileHeaderRecord(short versionMadeBy, short versionNee dataBlock.readFully(buffer, extraPos); zipEntry.setExtra(buffer.array()); } - if ((fileCommentLength() & 0xFFFF) > 0) { - long commentPos = MINIMUM_SIZE + fileNameLength + extraLength; + if (commentLength > 0) { + long commentPos = pos + MINIMUM_SIZE + fileNameLength + extraLength; zipEntry.setComment(ZipString.readString(dataBlock, commentPos, commentLength)); } } diff --git a/spring-boot-project/spring-boot-tools/spring-boot-loader/src/test/java/org/springframework/boot/loader/jar/NestedJarFileTests.java b/spring-boot-project/spring-boot-tools/spring-boot-loader/src/test/java/org/springframework/boot/loader/jar/NestedJarFileTests.java index ac6da2187b8..782dd1369ac 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-loader/src/test/java/org/springframework/boot/loader/jar/NestedJarFileTests.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-loader/src/test/java/org/springframework/boot/loader/jar/NestedJarFileTests.java @@ -23,10 +23,15 @@ import java.io.IOException; import java.io.InputStream; import java.lang.ref.Cleaner.Cleanable; import java.nio.charset.Charset; +import java.util.ArrayList; import java.util.Enumeration; +import java.util.List; +import java.util.UUID; import java.util.jar.JarEntry; import java.util.jar.JarFile; +import java.util.jar.JarOutputStream; import java.util.jar.Manifest; +import java.util.zip.ZipEntry; import java.util.zip.ZipFile; import org.assertj.core.extractor.Extractors; @@ -386,4 +391,42 @@ class NestedJarFileTests { } } + @Test // gh-39166 + void getCommentAlignsWithJdkJar() throws Exception { + File file = new File(this.tempDir, "testcomments.jar"); + try (JarOutputStream jar = new JarOutputStream(new FileOutputStream(file))) { + jar.putNextEntry(new ZipEntry("BOOT-INF/")); + jar.closeEntry(); + jar.putNextEntry(new ZipEntry("BOOT-INF/classes/")); + jar.closeEntry(); + for (int i = 0; i < 5; i++) { + ZipEntry entry = new ZipEntry("BOOT-INF/classes/T" + i + ".class"); + entry.setComment("T" + i); + jar.putNextEntry(entry); + jar.write(UUID.randomUUID().toString().getBytes()); + jar.closeEntry(); + } + } + List jdk = collectComments(new JarFile(file)); + List nested = collectComments(new NestedJarFile(file, "BOOT-INF/classes/")); + assertThat(nested).isEqualTo(jdk); + } + + private List collectComments(JarFile jarFile) throws IOException { + try { + List comments = new ArrayList<>(); + Enumeration entries = jarFile.entries(); + while (entries.hasMoreElements()) { + String comment = entries.nextElement().getComment(); + if (comment != null) { + comments.add(comment); + } + } + return comments; + } + finally { + jarFile.close(); + } + } + }