8023431: Test java/util/zip/GZIP/GZIPInZip.java failed

Properly close PipedStreams. Additional testing for malformed input

Reviewed-by: darcy, sherman
diff --git a/jdk/test/java/util/zip/GZIP/GZIPInZip.java b/jdk/test/java/util/zip/GZIP/GZIPInZip.java
index 558ad96..fab869a 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 @@
     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 @@
         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 @@
 
         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;
                 }