diff --git a/buildSrc/src/main/java/art/arcane/iris/buildtools/GenerationBuildRevision.java b/buildSrc/src/main/java/art/arcane/iris/buildtools/GenerationBuildRevision.java index d9b96e6e4..be0c9ab98 100644 --- a/buildSrc/src/main/java/art/arcane/iris/buildtools/GenerationBuildRevision.java +++ b/buildSrc/src/main/java/art/arcane/iris/buildtools/GenerationBuildRevision.java @@ -231,11 +231,11 @@ public final class GenerationBuildRevision { throw new IOException("Duplicate dependency artifact entry: " + name); } } + byte[] buffer = new byte[16 * 1024]; for (Map.Entry entry : entries.entrySet()) { update(digest, entry.getKey()); try (InputStream input = zip.getInputStream(entry.getValue())) { MessageDigest content = digest(); - byte[] buffer = new byte[16 * 1024]; int read; while ((read = input.read(buffer)) != -1) { content.update(buffer, 0, read); diff --git a/buildSrc/src/test/java/GenerationBuildRevisionTest.java b/buildSrc/src/test/java/GenerationBuildRevisionTest.java index 65aeafb08..c743154ab 100644 --- a/buildSrc/src/test/java/GenerationBuildRevisionTest.java +++ b/buildSrc/src/test/java/GenerationBuildRevisionTest.java @@ -58,6 +58,22 @@ public class GenerationBuildRevisionTest { GenerationBuildRevision.capture(fixture.options(), dependencies))); } + @Test + public void hashesLargeShortAndEmptyEntriesIndependently() throws Exception { + Path dependency = temporary.newFile("multiple-entries.jar").toPath(); + Map contents = Map.of("example/Large.class", "abc".repeat(11_000), + "example/Short.class", "tail", "example/Zero.class", ""); + try (ZipOutputStream output = new ZipOutputStream(Files.newOutputStream(dependency))) { + for (String name : List.of("example/Zero.class", "example/Short.class", "example/Large.class")) { + output.putNextEntry(new ZipEntry(name)); + output.write(contents.get(name).getBytes(StandardCharsets.UTF_8)); + output.closeEntry(); + } + } + assertEquals("49217af891afa3111d1f70a390acacc8bad700528b61b1ecc5637c060aeb52cd", + GenerationBuildRevision.artifactHash(dependency)); + } + @Test public void rejectsChangedAddedAndDeletedGenerationSources() throws Exception { Fixture fixture = fixture();