476708
From d09bb1ab8ef9bb91457c0ead09589e8807489260 Mon Sep 17 00:00:00 2001
476708
From: Ondrej Dubaj <odubaj@redhat.com>
476708
Date: Thu, 6 Aug 2020 08:09:53 +0200
476708
Subject: [PATCH] Permit a deflateParams() parameter change.
476708
476708
This change allows a parameter change even if the input data has
476708
not all been compressed and copied to the application output
476708
buffer, so long as all of the input data has been compressed to
476708
the internal pending output buffer. This also allows an immediate
476708
deflateParams change so long as there have been no deflate calls
476708
since initialization or reset.
476708
---
476708
 deflate.c |  6 +++---
476708
 zlib.h    | 11 ++++++-----
476708
 2 files changed, 9 insertions(+), 8 deletions(-)
476708
476708
diff --git a/deflate.c b/deflate.c
476708
index 9705c1c..f3c9924 100644
476708
--- a/deflate.c
476708
+++ b/deflate.c
476708
@@ -509,7 +509,7 @@ int ZEXPORT deflateResetKeep (strm)
476708
         s->wrap == 2 ? crc32(0L, Z_NULL, 0) :
476708
 #endif
476708
         adler32(0L, Z_NULL, 0);
476708
-    s->last_flush = Z_NO_FLUSH;
476708
+    s->last_flush = -2;
476708
 
476708
     _tr_init(s);
476708
 
476708
@@ -606,13 +606,13 @@ int ZEXPORT deflateParams(strm, level, strategy)
476708
     func = configuration_table[s->level].func;
476708
 
476708
     if ((strategy != s->strategy || func != configuration_table[level].func ||
476708
-        hook_flush != Z_NO_FLUSH) && s->high_water) {
476708
+        hook_flush != Z_NO_FLUSH) && s->last_flush != -2) {
476708
         /* Flush the last buffer: */
476708
         int err = deflate(strm, RANK(hook_flush) > RANK(Z_BLOCK) ?
476708
                           hook_flush : Z_BLOCK); 
476708
         if (err == Z_STREAM_ERROR)
476708
             return err;
476708
-        if (strm->avail_out == 0)
476708
+        if (strm->avail_in || (s->strstart - s->block_start) + s->lookahead)
476708
             return Z_BUF_ERROR;
476708
     }
476708
     if (s->level != level) {
476708
diff --git a/zlib.h b/zlib.h
476708
index f09cdaf..001624e 100644
476708
--- a/zlib.h
476708
+++ b/zlib.h
476708
@@ -712,11 +712,12 @@ ZEXTERN int ZEXPORT deflateParams OF((z_streamp strm,
476708
    used to switch between compression and straight copy of the input data, or
476708
    to switch to a different kind of input data requiring a different strategy.
476708
    If the compression approach (which is a function of the level) or the
476708
-   strategy is changed, and if any input has been consumed in a previous
476708
-   deflate() call, then the input available so far is compressed with the old
476708
-   level and strategy using deflate(strm, Z_BLOCK).  There are three approaches
476708
-   for the compression levels 0, 1..3, and 4..9 respectively.  The new level
476708
-   and strategy will take effect at the next call of deflate().
476708
+   strategy is changed, and if there have been any deflate() calls since the
476708
+   state was initialized or reset, then the input available so far is
476708
+   compressed with the old level and strategy using deflate(strm, Z_BLOCK).
476708
+   There are three approaches for the compression levels 0, 1..3, and 4..9
476708
+   respectively.  The new level and strategy will take effect at the next call
476708
+   of deflate().
476708
 
476708
      If a deflate(strm, Z_BLOCK) is performed by deflateParams(), and it does
476708
    not have enough output space to complete, then the parameter change will not
476708
-- 
476708
2.26.0
476708