Skip to content

Commit

Permalink
Fixed ubsan error when building tree with no symbols. madler#782
Browse files Browse the repository at this point in the history
When there are no symbols in the tree we skip build_tree calculations and emit a block using static tree with no codes.

trees.c:357:19: runtime error: unsigned integer overflow: 0 - 1 cannot be represented in type 'unsigned long'
    #0 0x1000ed79b in build_tree trees.c:357
    madler#1 0x1000ea3f5 in zng_tr_flush_block trees.c:649
    madler#2 0x100090ab0 in deflate_slow deflate_slow.c:131
    madler#3 0x1000572bc in zng_deflate deflate.c:990
    madler#4 0x1000aecd3 in gz_comp gzwrite.c:125
    madler#5 0x1000b05df in zng_gzclose_w gzwrite.c:511
    madler#6 0x1000967a4 in zng_gzclose gzlib.c:253
    madler#7 0x100004f70 in test_gzio example.c:133
    madler#8 0x100010c5b in main example.c:1034
    madler#9 0x7fff71f57cc8 in start+0x0 (libdyld.dylib:x86_64+0x1acc8)
  • Loading branch information
nmoinvaz authored and Dead2 committed Nov 2, 2020
1 parent cce302e commit f1f775d
Showing 1 changed file with 5 additions and 1 deletion.
6 changes: 5 additions & 1 deletion trees.c
Original file line number Diff line number Diff line change
Expand Up @@ -638,7 +638,11 @@ void Z_INTERNAL zng_tr_flush_block(deflate_state *s, char *buf, uint32_t stored_
int max_blindex = 0; /* index of last bit length code of non zero freq */

/* Build the Huffman trees unless a stored block is forced */
if (s->level > 0) {
if (UNLIKELY(s->sym_next == 0)) {
/* Emit an empty static tree block with no codes */
opt_lenb = static_lenb = 0;
s->static_len = 7;
} else if (s->level > 0) {
/* Check if the file is binary or text */
if (s->strm->data_type == Z_UNKNOWN)
s->strm->data_type = detect_data_type(s);
Expand Down

0 comments on commit f1f775d

Please sign in to comment.