From: Ilya Leoshkevich Date: Thu, 13 Aug 2020 09:55:01 +0000 (+0200) Subject: Fix DFLTCC not writing header bits when avail_out == 0 X-Git-Tag: 1.9.9-b1~82 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ce409c6aa617208338465363bdbd1e2533de2bec;p=thirdparty%2Fzlib-ng.git Fix DFLTCC not writing header bits when avail_out == 0 --- diff --git a/arch/s390/dfltcc_deflate.c b/arch/s390/dfltcc_deflate.c index 4692789f8..4db18fe40 100644 --- a/arch/s390/dfltcc_deflate.c +++ b/arch/s390/dfltcc_deflate.c @@ -162,13 +162,18 @@ again: send_eobs(strm, param); 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.