8206863: A closed JarVerifier.VerifierStream should throw IOException

Co-authored-by: Tobias Thierer <tobiast@google.com>
Reviewed-by: rasbold
This commit is contained in:
Martin Buchholz 2018-07-17 17:36:27 -07:00
parent b30fe07450
commit 796a53f6e5
2 changed files with 32 additions and 2 deletions

View file

@ -437,7 +437,7 @@ class JarVerifier {
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 @@ class JarVerifier {
public int read() throws IOException
{
ensureOpen();
if (numLeft > 0) {
int b = is.read();
jv.update(b, mev);
@ -461,6 +462,7 @@ class JarVerifier {
}
public int read(byte b[], int off, int len) throws IOException {
ensureOpen();
if ((numLeft > 0) && (numLeft < len)) {
len = (int)numLeft;
}
@ -488,9 +490,15 @@ class JarVerifier {
}
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

View file

@ -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 @@ public class SignedJarFileGetInputStream {
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) {}
}
}