aboutsummaryrefslogtreecommitdiff
path: root/deflate.c
diff options
context:
space:
mode:
authorMark Adler <madler@alumni.caltech.edu>2016-10-27 22:50:43 -0700
committerMark Adler <madler@alumni.caltech.edu>2016-10-27 22:50:43 -0700
commit94575859cf7f657f0f31aff4c50761fe3f182699 (patch)
tree8853a8bc185895a739435457f0e9737c3a50da67 /deflate.c
parentbedea2483b6cf0f5af0f50010031bb56f5512124 (diff)
downloadzlib-94575859cf7f657f0f31aff4c50761fe3f182699.tar.gz
zlib-94575859cf7f657f0f31aff4c50761fe3f182699.tar.bz2
zlib-94575859cf7f657f0f31aff4c50761fe3f182699.zip
Fix bug when level 0 used with Z_HUFFMAN or Z_RLE.
Compression level 0 requests no compression, using only stored blocks. When Z_HUFFMAN or Z_RLE was used with level 0 (granted, an odd choice, but permitted), the resulting blocks were mostly fixed or dynamic. The reason is that deflate_stored() was not being called in that case. The compressed data was valid, but it was not what the application requested. This commit assures that only stored blocks are emitted for compression level 0, regardless of the strategy selected.
Diffstat (limited to 'deflate.c')
-rw-r--r--deflate.c7
1 files changed, 4 insertions, 3 deletions
diff --git a/deflate.c b/deflate.c
index 537c4a3..85e30bc 100644
--- a/deflate.c
+++ b/deflate.c
@@ -914,9 +914,10 @@ int ZEXPORT deflate (strm, flush)
914 (flush != Z_NO_FLUSH && s->status != FINISH_STATE)) { 914 (flush != Z_NO_FLUSH && s->status != FINISH_STATE)) {
915 block_state bstate; 915 block_state bstate;
916 916
917 bstate = s->strategy == Z_HUFFMAN_ONLY ? deflate_huff(s, flush) : 917 bstate = s->level == 0 ? deflate_stored(s, flush) :
918 (s->strategy == Z_RLE ? deflate_rle(s, flush) : 918 s->strategy == Z_HUFFMAN_ONLY ? deflate_huff(s, flush) :
919 (*(configuration_table[s->level].func))(s, flush)); 919 s->strategy == Z_RLE ? deflate_rle(s, flush) :
920 (*(configuration_table[s->level].func))(s, flush);
920 921
921 if (bstate == finish_started || bstate == finish_done) { 922 if (bstate == finish_started || bstate == finish_done) {
922 s->status = FINISH_STATE; 923 s->status = FINISH_STATE;