From fad5094503d9c773f45da76254ff80c28f31b2bc Mon Sep 17 00:00:00 2001 From: Xueming Shen Date: Fri, 1 Dec 2017 22:04:03 -0800 Subject: [PATCH] 8191918: tomcat gzip-compressed response bodies appear to be broken in update 151 Reviewed-by: psandoz --- src/java.base/share/native/libzip/Deflater.c | 13 +- .../share/native/libzip/zlib/deflate.c | 6 +- .../native/libzip/zlib/patches/ChangeLog_java | 2 + .../java/util/zip/InflateIn_DeflateOut.java | 113 +++++++++++++++++- 4 files changed, 119 insertions(+), 15 deletions(-) diff --git a/src/java.base/share/native/libzip/Deflater.c b/src/java.base/share/native/libzip/Deflater.c index 7492a082170..b666a16145a 100644 --- a/src/java.base/share/native/libzip/Deflater.c +++ b/src/java.base/share/native/libzip/Deflater.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -164,17 +164,14 @@ Java_java_util_zip_Deflater_deflateBytes(JNIEnv *env, jobject this, jlong addr, res = deflateParams(strm, level, strategy); (*env)->ReleasePrimitiveArrayCritical(env, b, out_buf, 0); (*env)->ReleasePrimitiveArrayCritical(env, this_buf, in_buf, 0); - switch (res) { case Z_OK: (*env)->SetBooleanField(env, this, setParamsID, JNI_FALSE); + case Z_BUF_ERROR: this_off += this_len - strm->avail_in; (*env)->SetIntField(env, this, offID, this_off); (*env)->SetIntField(env, this, lenID, strm->avail_in); return (jint) (len - strm->avail_out); - case Z_BUF_ERROR: - (*env)->SetBooleanField(env, this, setParamsID, JNI_FALSE); - return 0; default: JNU_ThrowInternalError(env, strm->msg); return 0; @@ -203,19 +200,17 @@ Java_java_util_zip_Deflater_deflateBytes(JNIEnv *env, jobject this, jlong addr, res = deflate(strm, finish ? Z_FINISH : flush); (*env)->ReleasePrimitiveArrayCritical(env, b, out_buf, 0); (*env)->ReleasePrimitiveArrayCritical(env, this_buf, in_buf, 0); - switch (res) { case Z_STREAM_END: (*env)->SetBooleanField(env, this, finishedID, JNI_TRUE); /* fall through */ case Z_OK: + case Z_BUF_ERROR: this_off += this_len - strm->avail_in; (*env)->SetIntField(env, this, offID, this_off); (*env)->SetIntField(env, this, lenID, strm->avail_in); return len - strm->avail_out; - case Z_BUF_ERROR: - return 0; - default: + default: JNU_ThrowInternalError(env, strm->msg); return 0; } diff --git a/src/java.base/share/native/libzip/zlib/deflate.c b/src/java.base/share/native/libzip/zlib/deflate.c index 305364b883a..f30f71bdd79 100644 --- a/src/java.base/share/native/libzip/zlib/deflate.c +++ b/src/java.base/share/native/libzip/zlib/deflate.c @@ -505,8 +505,6 @@ int ZEXPORT deflateResetKeep (strm) s->pending = 0; s->pending_out = s->pending_buf; - s->high_water = 0; /* reset to its inital value 0 */ - if (s->wrap < 0) { s->wrap = -s->wrap; /* was made negative by deflate(..., Z_FINISH); */ } @@ -520,7 +518,7 @@ int ZEXPORT deflateResetKeep (strm) s->wrap == 2 ? crc32(0L, Z_NULL, 0) : #endif adler32(0L, Z_NULL, 0); - s->last_flush = Z_NO_FLUSH; + s->last_flush = -2; _tr_init(s); @@ -613,7 +611,7 @@ int ZEXPORT deflateParams(strm, level, strategy) func = configuration_table[s->level].func; if ((strategy != s->strategy || func != configuration_table[level].func) && - s->high_water) { + s->last_flush != -2) { /* Flush the last buffer: */ int err = deflate(strm, Z_BLOCK); if (err == Z_STREAM_ERROR) diff --git a/src/java.base/share/native/libzip/zlib/patches/ChangeLog_java b/src/java.base/share/native/libzip/zlib/patches/ChangeLog_java index 22c6076860b..25e88808cd8 100644 --- a/src/java.base/share/native/libzip/zlib/patches/ChangeLog_java +++ b/src/java.base/share/native/libzip/zlib/patches/ChangeLog_java @@ -93,4 +93,6 @@ s->status = #ifdef GZIP +(7) deflate.c undo (6), replaced withe the official zlib repo fix see#305/#f969409 + diff --git a/test/jdk/java/util/zip/InflateIn_DeflateOut.java b/test/jdk/java/util/zip/InflateIn_DeflateOut.java index 0747d22b0a2..e9c9c59e24e 100644 --- a/test/jdk/java/util/zip/InflateIn_DeflateOut.java +++ b/test/jdk/java/util/zip/InflateIn_DeflateOut.java @@ -23,8 +23,9 @@ /** * @test - * @bug 4206909 4813885 - * @summary Test basic functionality of DeflaterOutputStream/InflaterInputStream and GZIPOutputStream/GZIPInputStream, including flush + * @bug 4206909 4813885 8191918 + * @summary Test basic functionality of DeflaterOutputStream/InflaterInputStream + * and GZIPOutputStream/GZIPInputStream, including flush * @key randomness */ @@ -147,6 +148,36 @@ public class InflateIn_DeflateOut { check(Arrays.equals(data, buf)); } + private static void TestFlushableGZIPOutputStream() throws Throwable { + var random = new Random(new Date().getTime()); + + var byteOutStream = new ByteArrayOutputStream(); + var output = new FlushableGZIPOutputStream(byteOutStream); + + var data = new byte[random.nextInt(1024 * 1024)]; + var buf = new byte[data.length]; + random.nextBytes(data); + + output.write(data); + for (int i=0; i 0) { + out.write(buf, 0, len); + } + } while (len != 0); + } + +}