diff options
| author | Mark Adler <fork@madler.net> | 2022-10-01 19:55:29 -0700 |
|---|---|---|
| committer | Mark Adler <fork@madler.net> | 2022-10-03 11:42:18 -0700 |
| commit | 7fabcb53576aca08b8e25174eb7b0df7c585e4e0 (patch) | |
| tree | 8b626ddb69eeca31639eec2f93d8b6dedfd09536 | |
| parent | 2d6d59e4728a45240c9d238adbeb33032e9eb19d (diff) | |
| download | zlib-7fabcb53576aca08b8e25174eb7b0df7c585e4e0.tar.gz zlib-7fabcb53576aca08b8e25174eb7b0df7c585e4e0.tar.bz2 zlib-7fabcb53576aca08b8e25174eb7b0df7c585e4e0.zip | |
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.
| -rw-r--r-- | trees.c | 11 |
1 files changed, 5 insertions, 6 deletions
| @@ -950,7 +950,10 @@ void ZLIB_INTERNAL _tr_flush_block(s, buf, stored_len, last) | |||
| 950 | opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len, | 950 | opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len, |
| 951 | s->sym_next / 3)); | 951 | s->sym_next / 3)); |
| 952 | 952 | ||
| 953 | if (static_lenb <= opt_lenb) opt_lenb = static_lenb; | 953 | #ifndef FORCE_STATIC |
| 954 | if (static_lenb <= opt_lenb || s->strategy == Z_FIXED) | ||
| 955 | #endif | ||
| 956 | opt_lenb = static_lenb; | ||
| 954 | 957 | ||
| 955 | } else { | 958 | } else { |
| 956 | Assert(buf != (char*)0, "lost buf"); | 959 | Assert(buf != (char*)0, "lost buf"); |
| @@ -971,11 +974,7 @@ void ZLIB_INTERNAL _tr_flush_block(s, buf, stored_len, last) | |||
| 971 | */ | 974 | */ |
| 972 | _tr_stored_block(s, buf, stored_len, last); | 975 | _tr_stored_block(s, buf, stored_len, last); |
| 973 | 976 | ||
| 974 | #ifdef FORCE_STATIC | 977 | } else if (static_lenb == opt_lenb) { |
| 975 | } else if (static_lenb >= 0) { /* force static trees */ | ||
| 976 | #else | ||
| 977 | } else if (s->strategy == Z_FIXED || static_lenb == opt_lenb) { | ||
| 978 | #endif | ||
| 979 | send_bits(s, (STATIC_TREES<<1)+last, 3); | 978 | send_bits(s, (STATIC_TREES<<1)+last, 3); |
| 980 | compress_block(s, (const ct_data *)static_ltree, | 979 | compress_block(s, (const ct_data *)static_ltree, |
| 981 | (const ct_data *)static_dtree); | 980 | (const ct_data *)static_dtree); |
