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