diff options
author | Mikhail Zaslonko <zaslonko@linux.ibm.com> | 2023-01-26 14:14:25 +0100 |
---|---|---|
committer | Andrew Morton <akpm@linux-foundation.org> | 2023-02-03 07:50:09 +0100 |
commit | cbf125408d1ca141cc1c3f8376e091e3cdde2cb2 (patch) | |
tree | 87ba39834198f86e5fd35b8943ccfaa0d9457075 | |
parent | lib/zlib: fix DFLTCC ignoring flush modes when avail_in == 0 (diff) | |
download | linux-cbf125408d1ca141cc1c3f8376e091e3cdde2cb2.tar.xz linux-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>
-rw-r--r-- | lib/zlib_dfltcc/dfltcc_deflate.c | 13 |
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. |