Skip to content

Commit c8a03e2

Browse files
authored
handle empty jar, add test (#16)
1 parent 026bc1f commit c8a03e2

3 files changed

Lines changed: 21 additions & 2 deletions

File tree

src/main/java/cpw/mods/jarhandling/impl/Jar.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -90,12 +90,13 @@ public Jar(final Supplier<Manifest> defaultManifest, final Function<SecureJar, J
9090
var jv = SecureJarVerifier.getJarVerifier(jis);
9191
if (jv != null) {
9292
while (SecureJarVerifier.isParsingMeta(jv)) {
93-
jis.getNextJarEntry();
93+
if (jis.getNextJarEntry() == null) break;
9494
}
9595

9696
if (SecureJarVerifier.hasSignatures(jv)) {
9797
pendingSigners.putAll(SecureJarVerifier.getPendingSigners(jv));
98-
verifiedSigners.put(JarFile.MANIFEST_NAME, SecureJarVerifier.getVerifiedSigners(jv).get(JarFile.MANIFEST_NAME));
98+
var manifestSigners = SecureJarVerifier.getVerifiedSigners(jv).get(JarFile.MANIFEST_NAME);
99+
if (manifestSigners != null) verifiedSigners.put(JarFile.MANIFEST_NAME, manifestSigners);
99100
StatusData.add(JarFile.MANIFEST_NAME, Status.VERIFIED, verifiedSigners.get(JarFile.MANIFEST_NAME), this);
100101
}
101102
}

src/test/java/cpw/mods/jarhandling/impl/TestSecureJarLoading.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,4 +104,22 @@ void testPartial() throws Exception {
104104
final var ucs = ((Jar)jar).verifyAndGetSigners(uentry.getName(), zf.getInputStream(uentry).readAllBytes());
105105
assertNull(ucs);
106106
}
107+
108+
@Test // Has a jar with only a manifest
109+
void testEmptyJar() throws Exception {
110+
final var path = Paths.get("src", "test", "resources", "empty.zip");
111+
SecureJar jar = SecureJar.from(path);
112+
try (var is = Files.newInputStream(path)) {
113+
ZipInputStream zis = new ZipInputStream(is);
114+
for (var ze = zis.getNextEntry(); ze!=null; ze=zis.getNextEntry()) {
115+
if (SecureJarVerifier.isSigningRelated(ze.getName())) continue;
116+
if (ze.isDirectory()) continue;
117+
final var zeName = ze.getName();
118+
var cs = ((Jar)jar).verifyAndGetSigners(ze.getName(), zis.readAllBytes());
119+
assertAll("Jar behaves correctly",
120+
()->assertNull(cs, "No code signers")
121+
);
122+
}
123+
}
124+
}
107125
}

src/test/resources/empty.zip

299 Bytes
Binary file not shown.

0 commit comments

Comments
 (0)