igzip: Create flag to determine maximum symbols decoded

Change-Id: I94c185bf10662931248ccae07aa5659626f1deb2
Signed-off-by: Roy Oursler <roy.j.oursler@intel.com>
This commit is contained in:
Roy Oursler 2018-04-13 14:56:33 -07:00 committed by Greg Tucker
parent 2de5a0fd88
commit b3ddaff6c5

View File

@ -72,6 +72,11 @@ extern int decode_huffman_code_block_stateless(struct inflate_state *);
#define MIN_DEF_MATCH 3 #define MIN_DEF_MATCH 3
#define TRIPLE_SYM_FLAG 0
#define DOUBLE_SYM_FLAG TRIPLE_SYM_FLAG + 1
#define SINGLE_SYM_FLAG DOUBLE_SYM_FLAG + 1
#define DEFAULT_SYM_FLAG TRIPLE_SYM_FLAG
/* structure contain lookup data based on RFC 1951 */ /* structure contain lookup data based on RFC 1951 */
struct rfc1951_tables { struct rfc1951_tables {
uint8_t dist_extra_bit_count[32]; uint8_t dist_extra_bit_count[32];
@ -297,7 +302,8 @@ static void inline expand_lit_len_huffcode(struct huff_code *lit_len_huff,
* of each code length */ * of each code length */
static void make_inflate_huff_code_lit_len(struct inflate_huff_code_large *result, static void make_inflate_huff_code_lit_len(struct inflate_huff_code_large *result,
struct huff_code *huff_code_table, struct huff_code *huff_code_table,
uint32_t table_length, uint16_t * count_total) uint32_t table_length, uint16_t * count_total,
uint32_t multisym)
{ {
int i, j, k; int i, j, k;
uint16_t code = 0; uint16_t code = 0;
@ -384,7 +390,7 @@ static void make_inflate_huff_code_lit_len(struct inflate_huff_code_large *resul
} }
/* Continue if no pairs are possible */ /* Continue if no pairs are possible */
if (last_length < 2 * min_length) if (multisym >= SINGLE_SYM_FLAG || last_length < 2 * min_length)
continue; continue;
/* Encode code pairs */ /* Encode code pairs */
@ -420,7 +426,7 @@ static void make_inflate_huff_code_lit_len(struct inflate_huff_code_large *resul
} }
/* Continue if no triples are possible */ /* Continue if no triples are possible */
if (last_length < 3 * min_length) if (multisym >= DOUBLE_SYM_FLAG || last_length < 3 * min_length)
continue; continue;
/* Encode code triples */ /* Encode code triples */
@ -856,6 +862,7 @@ static int inline setup_static_header(struct inflate_state *state)
int i; int i;
struct huff_code lit_code[LIT_LEN_ELEMS]; struct huff_code lit_code[LIT_LEN_ELEMS];
struct huff_code dist_code[DIST_LEN + 2]; struct huff_code dist_code[DIST_LEN + 2];
uint32_t multisym = SINGLE_SYM_FLAG;
/* These tables are based on the static huffman tree described in RFC /* These tables are based on the static huffman tree described in RFC
* 1951 */ * 1951 */
uint16_t lit_count[MAX_LIT_LEN_COUNT] = { uint16_t lit_count[MAX_LIT_LEN_COUNT] = {
@ -889,7 +896,7 @@ static int inline setup_static_header(struct inflate_state *state)
expand_lit_len_huffcode(lit_code, lit_count); expand_lit_len_huffcode(lit_code, lit_count);
make_inflate_huff_code_lit_len(&state->lit_huff_code, lit_code, LIT_LEN_ELEMS, make_inflate_huff_code_lit_len(&state->lit_huff_code, lit_code, LIT_LEN_ELEMS,
lit_count); lit_count, multisym);
make_inflate_huff_code_dist(&state->dist_huff_code, dist_code, DIST_LEN + 2, make_inflate_huff_code_dist(&state->dist_huff_code, dist_code, DIST_LEN + 2,
dist_count, DIST_LEN); dist_count, DIST_LEN);
@ -1069,7 +1076,7 @@ static int inline setup_dynamic_header(struct inflate_state *state)
uint16_t code_count[16], lit_count[MAX_LIT_LEN_COUNT], dist_count[16]; uint16_t code_count[16], lit_count[MAX_LIT_LEN_COUNT], dist_count[16];
uint16_t *count; uint16_t *count;
uint16_t symbol; uint16_t symbol;
uint32_t multisym = DEFAULT_SYM_FLAG;
/* This order is defined in RFC 1951 page 13 */ /* This order is defined in RFC 1951 page 13 */
const uint8_t code_length_code_order[CODE_LEN_CODES] = { const uint8_t code_length_code_order[CODE_LEN_CODES] = {
0x10, 0x11, 0x12, 0x00, 0x08, 0x07, 0x09, 0x06, 0x10, 0x11, 0x12, 0x00, 0x08, 0x07, 0x09, 0x06,
@ -1077,6 +1084,10 @@ static int inline setup_dynamic_header(struct inflate_state *state)
0x0e, 0x01, 0x0f 0x0e, 0x01, 0x0f
}; };
if (state->bfinal && state->avail_in <= 8 * 1024) {
multisym = DOUBLE_SYM_FLAG;
}
memset(code_count, 0, sizeof(code_count)); memset(code_count, 0, sizeof(code_count));
memset(lit_count, 0, sizeof(lit_count)); memset(lit_count, 0, sizeof(lit_count));
memset(dist_count, 0, sizeof(dist_count)); memset(dist_count, 0, sizeof(dist_count));
@ -1221,7 +1232,7 @@ static int inline setup_dynamic_header(struct inflate_state *state)
set_codes(lit_and_dist_huff, LIT_LEN, lit_count); set_codes(lit_and_dist_huff, LIT_LEN, lit_count);
expand_lit_len_huffcode(lit_and_dist_huff, lit_count); expand_lit_len_huffcode(lit_and_dist_huff, lit_count);
make_inflate_huff_code_lit_len(&state->lit_huff_code, lit_and_dist_huff, LIT_LEN_ELEMS, make_inflate_huff_code_lit_len(&state->lit_huff_code, lit_and_dist_huff, LIT_LEN_ELEMS,
lit_count); lit_count, multisym);
state->block_state = ISAL_BLOCK_CODED; state->block_state = ISAL_BLOCK_CODED;