From 7fabcb53576aca08b8e25174eb7b0df7c585e4e0 Mon Sep 17 00:00:00 2001 From: Mark Adler Date: Sat, 1 Oct 2022 19:55:29 -0700 Subject: Fix bug in block type selection when Z_FIXED used. A fixed block could be chosen when a stored block was smaller. Now the smaller of the two is always chosen. --- trees.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/trees.c b/trees.c index 72b521f..340173c 100644 --- a/trees.c +++ b/trees.c @@ -950,7 +950,10 @@ void ZLIB_INTERNAL _tr_flush_block(s, buf, stored_len, last) opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len, s->sym_next / 3)); - if (static_lenb <= opt_lenb) opt_lenb = static_lenb; +#ifndef FORCE_STATIC + if (static_lenb <= opt_lenb || s->strategy == Z_FIXED) +#endif + opt_lenb = static_lenb; } else { Assert(buf != (char*)0, "lost buf"); @@ -971,11 +974,7 @@ void ZLIB_INTERNAL _tr_flush_block(s, buf, stored_len, last) */ _tr_stored_block(s, buf, stored_len, last); -#ifdef FORCE_STATIC - } else if (static_lenb >= 0) { /* force static trees */ -#else - } else if (s->strategy == Z_FIXED || static_lenb == opt_lenb) { -#endif + } else if (static_lenb == opt_lenb) { send_bits(s, (STATIC_TREES<<1)+last, 3); compress_block(s, (const ct_data *)static_ltree, (const ct_data *)static_dtree); -- cgit v1.2.1