]> git.lizzy.rs Git - zlib.git/commitdiff
Fix bug when level 0 used with Z_HUFFMAN or Z_RLE.
authorMark Adler <madler@alumni.caltech.edu>
Fri, 28 Oct 2016 05:50:43 +0000 (22:50 -0700)
committerMark Adler <madler@alumni.caltech.edu>
Fri, 28 Oct 2016 05:50:43 +0000 (22:50 -0700)
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.

deflate.c

index 537c4a3dbfb94ab152fda84f5f03f837e4b3f2fe..85e30bcf3f3ab4ca5c93a68e61e1ecf3afd9277e 100644 (file)
--- a/deflate.c
+++ b/deflate.c
@@ -914,9 +914,10 @@ int ZEXPORT deflate (strm, flush)
         (flush != Z_NO_FLUSH && s->status != FINISH_STATE)) {
         block_state bstate;
 
-        bstate = s->strategy == Z_HUFFMAN_ONLY ? deflate_huff(s, flush) :
-                    (s->strategy == Z_RLE ? deflate_rle(s, flush) :
-                        (*(configuration_table[s->level].func))(s, flush));
+        bstate = s->level == 0 ? deflate_stored(s, flush) :
+                 s->strategy == Z_HUFFMAN_ONLY ? deflate_huff(s, flush) :
+                 s->strategy == Z_RLE ? deflate_rle(s, flush) :
+                 (*(configuration_table[s->level].func))(s, flush);
 
         if (bstate == finish_started || bstate == finish_done) {
             s->status = FINISH_STATE;