|
|
|
@ -723,6 +723,7 @@ int flush; |
|
|
|
|
CRC2(state->check, hold); |
|
|
|
|
INITBITS(); |
|
|
|
|
state->mode = TIME; |
|
|
|
|
/* fallthrough */ |
|
|
|
|
case TIME: |
|
|
|
|
NEEDBITS(32); |
|
|
|
|
if (state->head != Z_NULL) |
|
|
|
@ -731,6 +732,7 @@ int flush; |
|
|
|
|
CRC4(state->check, hold); |
|
|
|
|
INITBITS(); |
|
|
|
|
state->mode = OS; |
|
|
|
|
/* fallthrough */ |
|
|
|
|
case OS: |
|
|
|
|
NEEDBITS(16); |
|
|
|
|
if (state->head != Z_NULL) { |
|
|
|
@ -741,6 +743,7 @@ int flush; |
|
|
|
|
CRC2(state->check, hold); |
|
|
|
|
INITBITS(); |
|
|
|
|
state->mode = EXLEN; |
|
|
|
|
/* fallthrough */ |
|
|
|
|
case EXLEN: |
|
|
|
|
if (state->flags & 0x0400) { |
|
|
|
|
NEEDBITS(16); |
|
|
|
@ -754,6 +757,7 @@ int flush; |
|
|
|
|
else if (state->head != Z_NULL) |
|
|
|
|
state->head->extra = Z_NULL; |
|
|
|
|
state->mode = EXTRA; |
|
|
|
|
/* fallthrough */ |
|
|
|
|
case EXTRA: |
|
|
|
|
if (state->flags & 0x0400) { |
|
|
|
|
copy = state->length; |
|
|
|
@ -776,6 +780,7 @@ int flush; |
|
|
|
|
} |
|
|
|
|
state->length = 0; |
|
|
|
|
state->mode = NAME; |
|
|
|
|
/* fallthrough */ |
|
|
|
|
case NAME: |
|
|
|
|
if (state->flags & 0x0800) { |
|
|
|
|
if (have == 0) goto inf_leave; |
|
|
|
@ -797,6 +802,7 @@ int flush; |
|
|
|
|
state->head->name = Z_NULL; |
|
|
|
|
state->length = 0; |
|
|
|
|
state->mode = COMMENT; |
|
|
|
|
/* fallthrough */ |
|
|
|
|
case COMMENT: |
|
|
|
|
if (state->flags & 0x1000) { |
|
|
|
|
if (have == 0) goto inf_leave; |
|
|
|
@ -817,6 +823,7 @@ int flush; |
|
|
|
|
else if (state->head != Z_NULL) |
|
|
|
|
state->head->comment = Z_NULL; |
|
|
|
|
state->mode = HCRC; |
|
|
|
|
/* fallthrough */ |
|
|
|
|
case HCRC: |
|
|
|
|
if (state->flags & 0x0200) { |
|
|
|
|
NEEDBITS(16); |
|
|
|
@ -840,6 +847,7 @@ int flush; |
|
|
|
|
strm->adler = state->check = ZSWAP32(hold); |
|
|
|
|
INITBITS(); |
|
|
|
|
state->mode = DICT; |
|
|
|
|
/* fallthrough */ |
|
|
|
|
case DICT: |
|
|
|
|
if (state->havedict == 0) { |
|
|
|
|
RESTORE(); |
|
|
|
@ -847,8 +855,10 @@ int flush; |
|
|
|
|
} |
|
|
|
|
strm->adler = state->check = adler32(0L, Z_NULL, 0); |
|
|
|
|
state->mode = TYPE; |
|
|
|
|
/* fallthrough */ |
|
|
|
|
case TYPE: |
|
|
|
|
if (flush == Z_BLOCK || flush == Z_TREES) goto inf_leave; |
|
|
|
|
/* fallthrough */ |
|
|
|
|
case TYPEDO: |
|
|
|
|
if (state->last) { |
|
|
|
|
BYTEBITS(); |
|
|
|
@ -899,8 +909,10 @@ int flush; |
|
|
|
|
INITBITS(); |
|
|
|
|
state->mode = COPY_; |
|
|
|
|
if (flush == Z_TREES) goto inf_leave; |
|
|
|
|
/* fallthrough */ |
|
|
|
|
case COPY_: |
|
|
|
|
state->mode = COPY; |
|
|
|
|
/* fallthrough */ |
|
|
|
|
case COPY: |
|
|
|
|
copy = state->length; |
|
|
|
|
if (copy) { |
|
|
|
@ -936,6 +948,7 @@ int flush; |
|
|
|
|
Tracev((stderr, "inflate: table sizes ok\n")); |
|
|
|
|
state->have = 0; |
|
|
|
|
state->mode = LENLENS; |
|
|
|
|
/* fallthrough */ |
|
|
|
|
case LENLENS: |
|
|
|
|
while (state->have < state->ncode) { |
|
|
|
|
NEEDBITS(3); |
|
|
|
@ -957,6 +970,7 @@ int flush; |
|
|
|
|
Tracev((stderr, "inflate: code lengths ok\n")); |
|
|
|
|
state->have = 0; |
|
|
|
|
state->mode = CODELENS; |
|
|
|
|
/* fallthrough */ |
|
|
|
|
case CODELENS: |
|
|
|
|
while (state->have < state->nlen + state->ndist) { |
|
|
|
|
for (;;) { |
|
|
|
@ -1040,8 +1054,10 @@ int flush; |
|
|
|
|
Tracev((stderr, "inflate: codes ok\n")); |
|
|
|
|
state->mode = LEN_; |
|
|
|
|
if (flush == Z_TREES) goto inf_leave; |
|
|
|
|
/* fallthrough */ |
|
|
|
|
case LEN_: |
|
|
|
|
state->mode = LEN; |
|
|
|
|
/* fallthrough */ |
|
|
|
|
case LEN: |
|
|
|
|
if (have >= 6 && left >= 258) { |
|
|
|
|
RESTORE(); |
|
|
|
@ -1091,6 +1107,7 @@ int flush; |
|
|
|
|
} |
|
|
|
|
state->extra = (unsigned)(here.op) & 15; |
|
|
|
|
state->mode = LENEXT; |
|
|
|
|
/* fallthrough */ |
|
|
|
|
case LENEXT: |
|
|
|
|
if (state->extra) { |
|
|
|
|
NEEDBITS(state->extra); |
|
|
|
@ -1101,6 +1118,7 @@ int flush; |
|
|
|
|
Tracevv((stderr, "inflate: length %u\n", state->length)); |
|
|
|
|
state->was = state->length; |
|
|
|
|
state->mode = DIST; |
|
|
|
|
/* fallthrough */ |
|
|
|
|
case DIST: |
|
|
|
|
for (;;) { |
|
|
|
|
here = state->distcode[BITS(state->distbits)]; |
|
|
|
@ -1128,6 +1146,7 @@ int flush; |
|
|
|
|
state->offset = (unsigned)here.val; |
|
|
|
|
state->extra = (unsigned)(here.op) & 15; |
|
|
|
|
state->mode = DISTEXT; |
|
|
|
|
/* fallthrough */ |
|
|
|
|
case DISTEXT: |
|
|
|
|
if (state->extra) { |
|
|
|
|
NEEDBITS(state->extra); |
|
|
|
@ -1144,6 +1163,7 @@ int flush; |
|
|
|
|
#endif |
|
|
|
|
Tracevv((stderr, "inflate: distance %u\n", state->offset)); |
|
|
|
|
state->mode = MATCH; |
|
|
|
|
/* fallthrough */ |
|
|
|
|
case MATCH: |
|
|
|
|
if (left == 0) goto inf_leave; |
|
|
|
|
copy = out - left; |
|
|
|
@ -1219,6 +1239,7 @@ int flush; |
|
|
|
|
} |
|
|
|
|
#ifdef GUNZIP |
|
|
|
|
state->mode = LENGTH; |
|
|
|
|
/* fallthrough */ |
|
|
|
|
case LENGTH: |
|
|
|
|
if (state->wrap && state->flags) { |
|
|
|
|
NEEDBITS(32); |
|
|
|
@ -1232,6 +1253,7 @@ int flush; |
|
|
|
|
} |
|
|
|
|
#endif |
|
|
|
|
state->mode = DONE; |
|
|
|
|
/* fallthrough */ |
|
|
|
|
case DONE: |
|
|
|
|
ret = Z_STREAM_END; |
|
|
|
|
goto inf_leave; |
|
|
|
@ -1241,6 +1263,7 @@ int flush; |
|
|
|
|
case MEM: |
|
|
|
|
return Z_MEM_ERROR; |
|
|
|
|
case SYNC: |
|
|
|
|
/* fallthrough */ |
|
|
|
|
default: |
|
|
|
|
return Z_STREAM_ERROR; |
|
|
|
|
} |
|
|
|
|