]> git.ipfire.org Git - thirdparty/zlib-ng.git/commitdiff
Fixed zero length stored block left open when using Z_SYNC_FLUSH. Moved toggling...
authorNathan Moinvaziri <nathan@solidstatenetworks.com>
Sat, 16 May 2020 22:37:27 +0000 (18:37 -0400)
committerHans Kristian Rosbach <hk-github@circlestorm.org>
Mon, 25 May 2020 14:40:56 +0000 (16:40 +0200)
CMakeLists.txt
arch/x86/deflate_quick.c
trees.c
trees_emit.h

index 5a5d0dabd312f633cb2e680f7124f32435d02442..da8d6eb824d6304941ac118bda4b3f21d9ae8d91 100644 (file)
@@ -1185,6 +1185,22 @@ if (ZLIB_ENABLE_TESTS)
             "-DCOMMAND=${GH_536_COMMAND}"
             -DINPUT=${CMAKE_CURRENT_SOURCE_DIR}/test/data/lcet10.txt
             -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/run-and-redirect.cmake)
+
+    set(GH_536_COMMAND ${CMAKE_CROSSCOMPILING_EMULATOR} $<TARGET_FILE:switchlevels> 6 15248 1 1050 2 25217)
+    add_test(NAME GH-536-deflate-zero-stored-block
+            COMMAND ${CMAKE_COMMAND}
+            "-DCOMMAND=${GH_536_COMMAND}"
+            -DINPUT=${CMAKE_CURRENT_SOURCE_DIR}/test/data/lcet10.txt
+            -DOUTPUT=${CMAKE_CURRENT_SOURCE_DIR}/test/data/lcet10-zl.txt.gz
+            -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/run-and-redirect.cmake)
+
+    set(GH_536_COMMAND ${CMAKE_CROSSCOMPILING_EMULATOR} $<TARGET_FILE:minigzip> -d)
+    add_test(NAME GH-536-inflate-zero-stored-block
+        COMMAND ${CMAKE_COMMAND}
+        "-DCOMMAND=${GH_536_COMMAND}"
+        -DINPUT=${CMAKE_CURRENT_SOURCE_DIR}/test/data/lcet10-zl.txt.gz
+        -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/run-and-redirect.cmake)
+
 endif()
 
 FEATURE_SUMMARY(WHAT ALL INCLUDE_QUIET_PACKAGES)
index 26ce0befdc9207fff67f1bcebaa55907cf2bca77..27907856336746fb3e45ad6256013abeac3a0fad 100644 (file)
@@ -38,6 +38,7 @@ ZLIB_INTERNAL block_state deflate_quick(deflate_state *s, int flush) {
     if (s->block_open == 0) {
         last = (flush == Z_FINISH) ? 1 : 0;
         zng_tr_emit_tree(s, STATIC_TREES, last);
+        s->block_open = 1;
     }
 
     do {
@@ -52,6 +53,7 @@ ZLIB_INTERNAL block_state deflate_quick(deflate_state *s, int flush) {
             fill_window(s);
             if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) {
                 zng_tr_emit_end_block(s, static_ltree, 0);
+                s->block_open = 0;
                 s->block_start = s->strstart;
                 flush_pending(s->strm);
                 return need_more;
@@ -96,6 +98,7 @@ ZLIB_INTERNAL block_state deflate_quick(deflate_state *s, int flush) {
 
     last = (flush == Z_FINISH) ? 1 : 0;
     zng_tr_emit_end_block(s, static_ltree, last);
+    s->block_open = 0;
     s->block_start = s->strstart;
     flush_pending(s->strm);
 
diff --git a/trees.c b/trees.c
index 430fe4172e5e48574b4f229f128035180465b5da..24fa12a6557e55c3e0a7cd29490e3f42fd3096fe 100644 (file)
--- a/trees.c
+++ b/trees.c
@@ -597,11 +597,12 @@ void ZLIB_INTERNAL zng_tr_stored_block(deflate_state *s, char *buf, unsigned lon
     put_short(s, (uint16_t)~stored_len);
     cmpr_bits_add(s, 32);
     sent_bits_add(s, 32);
-    if (stored_len)
+    if (stored_len) {
         memcpy(s->pending_buf + s->pending, (unsigned char *)buf, stored_len);
-    s->pending += stored_len;
-    cmpr_bits_add(s, stored_len << 3);
-    sent_bits_add(s, stored_len << 3);
+        s->pending += stored_len;
+        cmpr_bits_add(s, stored_len << 3);
+        sent_bits_add(s, stored_len << 3);
+    }
 }
 
 /* ===========================================================================
index 7ea29cb7edf32b820033f2c106e5ee121d7dfbad..e429ad568c13e0ae88d1eec54ae9bca7ea7d5fd7 100644 (file)
@@ -198,7 +198,6 @@ static inline void zng_emit_end_block(deflate_state *s, const ct_data *ltree, co
     send_code(s, END_BLOCK, ltree, bi_buf, bi_valid);
     s->bi_valid = bi_valid;
     s->bi_buf = bi_buf;
-    s->block_open = 0;
     Tracev((stderr, "\n+++ Emit End Block: Last: %u Pending: %u Total Out: %zu\n",
         last, s->pending, s->strm->total_out));
     (void)last;
@@ -229,7 +228,6 @@ static inline void zng_tr_emit_tree(deflate_state *s, int type, const int last)
     cmpr_bits_add(s, 3);
     s->bi_valid = bi_valid;
     s->bi_buf = bi_buf;
-    s->block_open = 1;
     Tracev((stderr, "\n--- Emit Tree: Last: %u\n", last));
 }