[5/8] lib/zlib: DFLTCC not writing header bits when avail_out == 0
Commit Message
This commit is based on:
https://github.com/zlib-ng/zlib-ng/commit/ce409c6
Signed-off-by: Mikhail Zaslonko <zaslonko@linux.ibm.com>
Acked-by: Ilya Leoshkevich <iii@linux.ibm.com>
---
lib/zlib_dfltcc/dfltcc_deflate.c | 13 +++++++++----
1 file changed, 9 insertions(+), 4 deletions(-)
@@ -170,13 +170,18 @@ int dfltcc_deflate(
param->bcf = 0;
dfltcc_state->block_threshold =
strm->total_in + dfltcc_state->block_size;
- if (strm->avail_out == 0) {
- *result = need_more;
- return 1;
- }
}
}
+ /* No space for compressed data. If we proceed, dfltcc_cmpr() will return
+ * DFLTCC_CC_OP1_TOO_SHORT without buffering header bits, but we will still
+ * set BCF=1, which is wrong. Avoid complications and return early.
+ */
+ if (strm->avail_out == 0) {
+ *result = need_more;
+ return 1;
+ }
+
/* The caller gave us too much data. Pass only one block worth of
* uncompressed data to DFLTCC and mask the rest, so that on the next
* iteration we start a new block.