summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorMikhail Zaslonko <zaslonko@linux.ibm.com>2023-01-26 14:14:25 +0100
committerAndrew Morton <akpm@linux-foundation.org>2023-02-02 22:50:09 -0800
commitcbf125408d1ca141cc1c3f8376e091e3cdde2cb2 (patch)
tree87ba39834198f86e5fd35b8943ccfaa0d9457075 /lib
parent0dbae46550363c88cf073aafc0e0b244b9f43555 (diff)
downloadlinux-stable-cbf125408d1ca141cc1c3f8376e091e3cdde2cb2.tar.gz
linux-stable-cbf125408d1ca141cc1c3f8376e091e3cdde2cb2.tar.bz2
linux-stable-cbf125408d1ca141cc1c3f8376e091e3cdde2cb2.zip
lib/zlib: DFLTCC not writing header bits when avail_out == 0
This commit is based on: https://github.com/zlib-ng/zlib-ng/commit/ce409c6 Link: https://lkml.kernel.org/r/20230126131428.1222214-6-zaslonko@linux.ibm.com Signed-off-by: Mikhail Zaslonko <zaslonko@linux.ibm.com> Acked-by: Ilya Leoshkevich <iii@linux.ibm.com> Cc: Heiko Carstens <hca@linux.ibm.com> Cc: Vasily Gorbik <gor@linux.ibm.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Diffstat (limited to 'lib')
-rw-r--r--lib/zlib_dfltcc/dfltcc_deflate.c13
1 files changed, 9 insertions, 4 deletions
diff --git a/lib/zlib_dfltcc/dfltcc_deflate.c b/lib/zlib_dfltcc/dfltcc_deflate.c
index 211d344710d5..d4c92f99808e 100644
--- a/lib/zlib_dfltcc/dfltcc_deflate.c
+++ b/lib/zlib_dfltcc/dfltcc_deflate.c
@@ -170,13 +170,18 @@ again:
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.