From: Nathan Moinvaziri Date: Sat, 16 May 2020 22:37:27 +0000 (-0400) Subject: Fixed zero length stored block left open when using Z_SYNC_FLUSH. Moved toggling... X-Git-Tag: 1.9.9-b1~282 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=6fb4e882a667601bdc73ed5cde38d11beb65cf4e;p=thirdparty%2Fzlib-ng.git Fixed zero length stored block left open when using Z_SYNC_FLUSH. Moved toggling of block_open back to deflate_quick since zero length stored block doesn't emit end of block code. --- diff --git a/CMakeLists.txt b/CMakeLists.txt index 5a5d0dabd..da8d6eb82 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -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} $ 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} $ -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) diff --git a/arch/x86/deflate_quick.c b/arch/x86/deflate_quick.c index 26ce0befd..279078563 100644 --- a/arch/x86/deflate_quick.c +++ b/arch/x86/deflate_quick.c @@ -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 430fe4172..24fa12a65 100644 --- 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); + } } /* =========================================================================== diff --git a/trees_emit.h b/trees_emit.h index 7ea29cb7e..e429ad568 100644 --- a/trees_emit.h +++ b/trees_emit.h @@ -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)); }