Peter Schiffer 1b3576d
From f1b8edadc3c733990f8a8de4d643f968e571ae85 Mon Sep 17 00:00:00 2001
Peter Schiffer 4f28307
From: Adam Tkac <atkac@redhat.com>
Peter Schiffer 4f28307
Date: Fri, 17 Aug 2012 15:13:48 +0200
Peter Schiffer 4f28307
Subject: [PATCH] Rank Z_BLOCK flush below Z_PARTIAL_FLUSH only when last
Peter Schiffer 4f28307
 flush was Z_BLOCK.
Peter Schiffer 4f28307
Peter Schiffer 4f28307
This fixes regression introduced by f1ebdd6a9c495a5db9a22aa80dd7d54ae7db42e9
Peter Schiffer 4f28307
(Permit stronger flushes after Z_BLOCK flushes.). Now this code is valid
Peter Schiffer 4f28307
again:
Peter Schiffer 4f28307
Peter Schiffer 4f28307
deflate(stream, Z_SYNC_FLUSH);
Peter Schiffer 4f28307
deflateParams(stream, newLevel, Z_DEFAULT_STRATEGY);
Peter Schiffer 4f28307
Peter Schiffer 4f28307
Signed-off-by: Adam Tkac <atkac@redhat.com>
Peter Schiffer 4f28307
---
Peter Schiffer 1b3576d
 deflate.c | 13 ++++++++++---
Peter Schiffer 1b3576d
 1 file changed, 10 insertions(+), 3 deletions(-)
Peter Schiffer 4f28307
Peter Schiffer 4f28307
diff --git a/deflate.c b/deflate.c
Peter Schiffer 1b3576d
index 9e4c2cb..3422f72 100644
Peter Schiffer 4f28307
--- a/deflate.c
Peter Schiffer 4f28307
+++ b/deflate.c
Peter Schiffer 1b3576d
@@ -882,9 +882,16 @@ int ZEXPORT deflate (strm, flush)
Peter Schiffer 4f28307
      * flushes. For repeated and useless calls with Z_FINISH, we keep
Peter Schiffer 4f28307
      * returning Z_STREAM_END instead of Z_BUF_ERROR.
Peter Schiffer 4f28307
      */
Peter Schiffer 4f28307
-    } else if (strm->avail_in == 0 && RANK(flush) <= RANK(old_flush) &&
Peter Schiffer 4f28307
-               flush != Z_FINISH) {
Peter Schiffer 1b3576d
-        ERR_RETURN(strm, Z_BUF_ERROR);
Peter Schiffer 1b3576d
+    } else if (strm->avail_in == 0 && flush != Z_FINISH) {
Peter Schiffer 1b3576d
+        char err;
Peter Schiffer 1b3576d
+
Peter Schiffer 1b3576d
+        /* Degrade Z_BLOCK only when last flush was Z_BLOCK */
Peter Schiffer 1b3576d
+        err = (old_flush == Z_BLOCK) ?
Peter Schiffer 1b3576d
+              RANK(flush) <= RANK(old_flush) : flush <= old_flush;
Peter Schiffer 1b3576d
+
Peter Schiffer 1b3576d
+        if (err) {
Peter Schiffer 1b3576d
+            ERR_RETURN(strm, Z_BUF_ERROR);
Peter Schiffer 1b3576d
+        }
Peter Schiffer 4f28307
     }
Peter Schiffer 4f28307
 
Peter Schiffer 1b3576d
     /* User must not provide more input after the first FINISH: */
Peter Schiffer 4f28307
-- 
Peter Schiffer 4f28307
1.7.11.4
Peter Schiffer 4f28307