From 71f33254816a17ff741e0119e16db28181d7b43b Mon Sep 17 00:00:00 2001 From: Ivan Gerasimov Date: Tue, 15 Oct 2013 21:15:17 +0400 Subject: [PATCH] 8023431: Test java/util/zip/GZIP/GZIPInZip.java failed Properly close PipedStreams. Additional testing for malformed input Reviewed-by: darcy, sherman --- jdk/test/java/util/zip/GZIP/GZIPInZip.java | 51 +++++++++++++++------- 1 file changed, 35 insertions(+), 16 deletions(-) diff --git a/jdk/test/java/util/zip/GZIP/GZIPInZip.java b/jdk/test/java/util/zip/GZIP/GZIPInZip.java index 558ad962e26..fab869ae1b6 100644 --- a/jdk/test/java/util/zip/GZIP/GZIPInZip.java +++ b/jdk/test/java/util/zip/GZIP/GZIPInZip.java @@ -22,12 +22,15 @@ */ /* @test - * @bug 7021870 - * @summary Reading last gzip chain member must not close the input stream + * @bug 7021870 8023431 + * @summary Reading last gzip chain member must not close the input stream. + * Garbage following gzip entry must be ignored. */ -import java.io.*; -import java.util.*; +import java.io.IOException; +import java.io.InputStream; +import java.io.PipedInputStream; +import java.io.PipedOutputStream; import java.util.zip.GZIPInputStream; import java.util.zip.GZIPOutputStream; import java.util.zip.ZipEntry; @@ -40,6 +43,15 @@ public class GZIPInZip { private static volatile Throwable trouble; public static void main(String[] args) throws Throwable { + doTest(false, false); + doTest(false, true); + doTest(true, false); + doTest(true, true); + } + + private static void doTest(final boolean appendGarbage, + final boolean limitGISBuff) + throws Throwable { final PipedOutputStream pos = new PipedOutputStream(); final PipedInputStream pis = new PipedInputStream(pos); @@ -47,17 +59,23 @@ public class GZIPInZip { Thread compressor = new Thread() { public void run() { final byte[] xbuf = { 'x' }; - try { - ZipOutputStream zos = new ZipOutputStream(pos); + try (ZipOutputStream zos = new ZipOutputStream(pos)) { zos.putNextEntry(new ZipEntry("a.gz")); - GZIPOutputStream gos1 = new GZIPOutputStream(zos); - gos1.write(xbuf); gos1.finish(); + try (GZIPOutputStream gos1 = new GZIPOutputStream(zos)) { + gos1.write(xbuf); + gos1.finish(); + } + if (appendGarbage) + zos.write(xbuf); + zos.closeEntry(); zos.putNextEntry(new ZipEntry("b.gz")); - GZIPOutputStream gos2 = new GZIPOutputStream(zos); - gos2.write(xbuf); gos2.finish(); + try (GZIPOutputStream gos2 = new GZIPOutputStream(zos)) { + gos2.write(xbuf); + gos2.finish(); + } zos.closeEntry(); } catch (Throwable t) { @@ -68,19 +86,20 @@ public class GZIPInZip { Thread uncompressor = new Thread() { public void run() { - try { - ZipInputStream zis = new ZipInputStream(pis); + try (ZipInputStream zis = new ZipInputStream(pis)) { zis.getNextEntry(); - InputStream gis = new GZIPInputStream(zis); - // try to read more than the entry has - gis.skip(2); + try (InputStream gis = limitGISBuff ? + new GZIPInputStream(zis, 4) : + new GZIPInputStream(zis)) { + // try to read more than the entry has + gis.skip(2); + } try { zis.getNextEntry(); } catch (IOException e) { throw new AssertionError("ZIP stream was prematurely closed"); } - } catch (Throwable t) { trouble = t; }