# HG changeset patch # User martin # Date 1531874187 25200 # Tue Jul 17 17:36:27 2018 -0700 # Node ID 03f2bfdcb63646823a1060a181584acbad7c17ea # Parent 6c5b015298734d136ed623e206df41392ad382fb 8206863: A closed JarVerifier.VerifierStream should throw IOException Reviewed-by: rasbold Contributed-by: Tobias Thierer , Martin Buchholz diff --git a/src/java.base/share/classes/java/util/jar/JarVerifier.java b/src/java.base/share/classes/java/util/jar/JarVerifier.java --- a/src/java.base/share/classes/java/util/jar/JarVerifier.java +++ b/src/java.base/share/classes/java/util/jar/JarVerifier.java @@ -437,7 +437,7 @@ InputStream is, JarVerifier jv) throws IOException { - this.is = is; + this.is = Objects.requireNonNull(is); this.jv = jv; this.mev = new ManifestEntryVerifier(man); this.jv.beginEntry(je, mev); @@ -448,6 +448,7 @@ public int read() throws IOException { + ensureOpen(); if (numLeft > 0) { int b = is.read(); jv.update(b, mev); @@ -461,6 +462,7 @@ } public int read(byte b[], int off, int len) throws IOException { + ensureOpen(); if ((numLeft > 0) && (numLeft < len)) { len = (int)numLeft; } @@ -488,9 +490,15 @@ } public int available() throws IOException { + ensureOpen(); return is.available(); } + private void ensureOpen() throws IOException { + if (is == null) { + throw new IOException("stream closed"); + } + } } // Extended JavaUtilJarAccess CodeSource API Support diff --git a/test/jdk/java/util/jar/JarFile/SignedJarFileGetInputStream.java b/test/jdk/java/util/jar/JarFile/SignedJarFileGetInputStream.java --- a/test/jdk/java/util/jar/JarFile/SignedJarFileGetInputStream.java +++ b/test/jdk/java/util/jar/JarFile/SignedJarFileGetInputStream.java @@ -22,7 +22,7 @@ */ /* @test - * @bug 4845692 + * @bug 4845692 8206863 * @summary JarFile.getInputStream should not throw when jar file is signed * @author Martin Buchholz */ @@ -42,5 +42,27 @@ InputStream is = jar.getInputStream(new ZipEntry(entry.getName())); is.close(); } + + // read(), available() on closed stream should throw IOException + InputStream is = jar.getInputStream(new ZipEntry("Test.class")); + is.close(); + byte[] buffer = new byte[1]; + + try { + is.read(); + throw new AssertionError("Should have thrown IOException"); + } catch (IOException success) {} + try { + is.read(buffer); + throw new AssertionError("Should have thrown IOException"); + } catch (IOException success) {} + try { + is.read(buffer, 0, buffer.length); + throw new AssertionError("Should have thrown IOException"); + } catch (IOException success) {} + try { + is.available(); + throw new AssertionError("Should have thrown IOException"); + } catch (IOException success) {} } }