8023431: Test java/util/zip/GZIP/GZIPInZip.java failed
Summary: Properly close PipedStreams. Additional testing for malformed input
Reviewed-by: darcy, sherman
--- a/jdk/test/java/util/zip/GZIP/GZIPInZip.java Wed Oct 16 14:39:00 2013 +0800
+++ b/jdk/test/java/util/zip/GZIP/GZIPInZip.java Tue Oct 15 21:15:17 2013 +0400
@@ -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;
}