From a225ed82339557610307f4ad61f79271a8594b78 Mon Sep 17 00:00:00 2001 From: tb Date: Thu, 1 Aug 2024 04:02:26 +0000 Subject: [PATCH] sync with upstream This adds a new public API, deflateUsed(), so is technically a minor bump. Nothing will be using this anytime soon, so no shared library bump. discussed with deraadt during c2k24 --- lib/libz/deflate.c | 14 +++++++++++++- lib/libz/deflate.h | 3 +++ lib/libz/trees.c | 2 ++ lib/libz/zconf.h | 1 + lib/libz/zlib.h | 12 ++++++++++++ 5 files changed, 31 insertions(+), 1 deletion(-) diff --git a/lib/libz/deflate.c b/lib/libz/deflate.c index 7ab6c9942a6..fd817eb11d3 100644 --- a/lib/libz/deflate.c +++ b/lib/libz/deflate.c @@ -715,6 +715,14 @@ int ZEXPORT deflatePending(z_streamp strm, unsigned *pending, int *bits) { return Z_OK; } +/* ========================================================================= */ +int ZEXPORT deflateUsed(z_streamp strm, int *bits) { + if (deflateStateCheck(strm)) return Z_STREAM_ERROR; + if (bits != Z_NULL) + *bits = strm->state->bi_used; + return Z_OK; +} + /* ========================================================================= */ int ZEXPORT deflatePrime(z_streamp strm, int bits, int value) { deflate_state *s; @@ -1742,8 +1750,10 @@ local block_state deflate_stored(deflate_state *s, int flush) { s->high_water = s->strstart; /* If the last block was written to next_out, then done. */ - if (last) + if (last) { + s->bi_used = 8; return finish_done; + } /* If flushing and all input has been consumed, then done. */ if (flush != Z_NO_FLUSH && flush != Z_FINISH && @@ -1795,6 +1805,8 @@ local block_state deflate_stored(deflate_state *s, int flush) { } /* We've done all we can with the available input and output. */ + if (last) + s->bi_used = 8; return last ? finish_started : need_more; } diff --git a/lib/libz/deflate.h b/lib/libz/deflate.h index 8182a260418..ad230ef7394 100644 --- a/lib/libz/deflate.h +++ b/lib/libz/deflate.h @@ -269,6 +269,9 @@ typedef struct internal_state { /* Number of valid bits in bi_buf. All bits above the last valid bit * are always zero. */ + int bi_used; + /* Last number of used bits when going to a byte boundary. + */ ulg high_water; /* High water mark offset in window for initialized bytes -- bytes above diff --git a/lib/libz/trees.c b/lib/libz/trees.c index cba0708b602..7ce629afb58 100644 --- a/lib/libz/trees.c +++ b/lib/libz/trees.c @@ -182,6 +182,7 @@ local void bi_windup(deflate_state *s) { } else if (s->bi_valid > 0) { put_byte(s, (Byte)s->bi_buf); } + s->bi_used = ((s->bi_valid - 1) & 7) + 1; s->bi_buf = 0; s->bi_valid = 0; #ifdef ZLIB_DEBUG @@ -464,6 +465,7 @@ void ZLIB_INTERNAL _tr_init(deflate_state *s) { s->bi_buf = 0; s->bi_valid = 0; + s->bi_used = 0; #ifdef ZLIB_DEBUG s->compressed_len = 0L; s->bits_sent = 0L; diff --git a/lib/libz/zconf.h b/lib/libz/zconf.h index 99066348c9e..ed924d08175 100644 --- a/lib/libz/zconf.h +++ b/lib/libz/zconf.h @@ -57,6 +57,7 @@ # define deflateSetDictionary z_deflateSetDictionary # define deflateSetHeader z_deflateSetHeader # define deflateTune z_deflateTune +# define deflateUsed z_deflateUsed # define deflate_copyright z_deflate_copyright # define get_crc_table z_get_crc_table # ifndef Z_SOLO diff --git a/lib/libz/zlib.h b/lib/libz/zlib.h index 5498b542064..ad33815f1b4 100644 --- a/lib/libz/zlib.h +++ b/lib/libz/zlib.h @@ -791,6 +791,18 @@ ZEXTERN int ZEXPORT deflatePending(z_streamp strm, stream state was inconsistent. */ +ZEXTERN int ZEXPORT deflateUsed(z_streamp strm, + int *bits); +/* + deflateUsed() returns in *bits the most recent number of deflate bits used + in the last byte when flushing to a byte boundary. The result is in 1..8, or + 0 if there has not yet been a flush. This helps determine the location of + the last bit of a deflate stream. + + deflateUsed returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent. + */ + ZEXTERN int ZEXPORT deflatePrime(z_streamp strm, int bits, int value); -- 2.20.1