aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Adler <madler@alumni.caltech.edu>2011-12-28 23:57:14 -0800
committerMark Adler <madler@alumni.caltech.edu>2011-12-28 23:57:14 -0800
commitf1ebdd6a9c495a5db9a22aa80dd7d54ae7db42e9 (patch)
treee6d279c19147fba9c2fa4118b9c9f2fe316e725f
parentbafcad90289cb72993e32a5fe8f31c4e60629f9e (diff)
downloadzlib-f1ebdd6a9c495a5db9a22aa80dd7d54ae7db42e9.tar.gz
zlib-f1ebdd6a9c495a5db9a22aa80dd7d54ae7db42e9.tar.bz2
zlib-f1ebdd6a9c495a5db9a22aa80dd7d54ae7db42e9.zip
Permit stronger flushes after Z_BLOCK flushes.
The incorporation of the Z_BLOCK flush did not update the rejection of lower ranked flushes immediately after higher ranked flushes with no more input data. This prevented an empty Z_SYNC_FLUSH right after a Z_BLOCK flush, which would be desired to bring the deflate stream to a byte boundary conditionally on whether or not it was already at a byte boundary. This patch re-ranks Z_BLOCK above Z_NO_FLUSH but below Z_PARTIAL_FLUSH, allowing stronger empty flushes to follow a Z_BLOCK flush.
-rw-r--r--deflate.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/deflate.c b/deflate.c
index f27febb..5d1d7bd 100644
--- a/deflate.c
+++ b/deflate.c
@@ -155,6 +155,9 @@ local const config configuration_table[10] = {
155struct static_tree_desc_s {int dummy;}; /* for buggy compilers */ 155struct static_tree_desc_s {int dummy;}; /* for buggy compilers */
156#endif 156#endif
157 157
158/* rank Z_BLOCK between Z_NO_FLUSH and Z_PARTIAL_FLUSH */
159#define RANK(f) (((f) << 1) - ((f) > 4 ? 9 : 0))
160
158/* =========================================================================== 161/* ===========================================================================
159 * Update a hash value with the given input byte 162 * Update a hash value with the given input byte
160 * IN assertion: all calls to to UPDATE_HASH are made with consecutive 163 * IN assertion: all calls to to UPDATE_HASH are made with consecutive
@@ -858,7 +861,7 @@ int ZEXPORT deflate (strm, flush)
858 * flushes. For repeated and useless calls with Z_FINISH, we keep 861 * flushes. For repeated and useless calls with Z_FINISH, we keep
859 * returning Z_STREAM_END instead of Z_BUF_ERROR. 862 * returning Z_STREAM_END instead of Z_BUF_ERROR.
860 */ 863 */
861 } else if (strm->avail_in == 0 && flush <= old_flush && 864 } else if (strm->avail_in == 0 && RANK(flush) <= RANK(old_flush) &&
862 flush != Z_FINISH) { 865 flush != Z_FINISH) {
863 ERR_RETURN(strm, Z_BUF_ERROR); 866 ERR_RETURN(strm, Z_BUF_ERROR);
864 } 867 }