1
2
3
4
5local void fixedtables OF((struct inflate_state FAR *state));
6local int updatewindow OF((z_streamp strm, unsigned out));
7
8int ZEXPORT inflateReset(z_streamp strm)
9{
10 struct inflate_state FAR *state;
11
12 if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
13 state = (struct inflate_state FAR *)strm->state;
14 strm->total_in = strm->total_out = state->total = 0;
15 strm->msg = Z_NULL;
16 strm->adler = 1;
17 state->mode = HEAD;
18 state->last = 0;
19 state->havedict = 0;
20 state->dmax = 32768U;
21 state->head = Z_NULL;
22 state->wsize = 0;
23 state->whave = 0;
24 state->write = 0;
25 state->hold = 0;
26 state->bits = 0;
27 state->lencode = state->distcode = state->next = state->codes;
28 WATCHDOG_RESET();
29 Tracev((stderr, "inflate: reset\n"));
30 return Z_OK;
31}
32
33int ZEXPORT inflateInit2_(z_streamp strm, int windowBits, const char *version,
34 int stream_size)
35{
36 struct inflate_state FAR *state;
37
38 if (version == Z_NULL || version[0] != ZLIB_VERSION[0] ||
39 stream_size != (int)(sizeof(z_stream)))
40 return Z_VERSION_ERROR;
41 if (strm == Z_NULL) return Z_STREAM_ERROR;
42 strm->msg = Z_NULL;
43 if (strm->zalloc == (alloc_func)0) {
44 strm->zalloc = zcalloc;
45 strm->opaque = (voidpf)0;
46 }
47 if (strm->zfree == (free_func)0) strm->zfree = zcfree;
48 state = (struct inflate_state FAR *)
49 ZALLOC(strm, 1, sizeof(struct inflate_state));
50 if (state == Z_NULL) return Z_MEM_ERROR;
51 Tracev((stderr, "inflate: allocated\n"));
52 strm->state = (struct internal_state FAR *)state;
53 if (windowBits < 0) {
54 state->wrap = 0;
55 windowBits = -windowBits;
56 }
57 else {
58 state->wrap = (windowBits >> 4) + 1;
59#ifdef GUNZIP
60 if (windowBits < 48) windowBits &= 15;
61#endif
62 }
63 if (windowBits < 8 || windowBits > 15) {
64 ZFREE(strm, state);
65 strm->state = Z_NULL;
66 return Z_STREAM_ERROR;
67 }
68 state->wbits = (unsigned)windowBits;
69 state->window = Z_NULL;
70 return inflateReset(strm);
71}
72
73int ZEXPORT inflateInit_(z_streamp strm, const char *version, int stream_size)
74{
75 return inflateInit2_(strm, DEF_WBITS, version, stream_size);
76}
77
78local void fixedtables(struct inflate_state FAR *state)
79{
80 state->lencode = lenfix;
81 state->lenbits = 9;
82 state->distcode = distfix;
83 state->distbits = 5;
84}
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100local int updatewindow(z_streamp strm, unsigned out)
101{
102 struct inflate_state FAR *state;
103 unsigned copy, dist;
104
105 state = (struct inflate_state FAR *)strm->state;
106
107
108 if (state->window == Z_NULL) {
109 state->window = (unsigned char FAR *)
110 ZALLOC(strm, 1U << state->wbits,
111 sizeof(unsigned char));
112 if (state->window == Z_NULL) return 1;
113 }
114
115
116 if (state->wsize == 0) {
117 state->wsize = 1U << state->wbits;
118 state->write = 0;
119 state->whave = 0;
120 }
121
122
123 copy = out - strm->avail_out;
124 if (copy >= state->wsize) {
125 zmemcpy(state->window, strm->next_out - state->wsize, state->wsize);
126 state->write = 0;
127 state->whave = state->wsize;
128 }
129 else {
130 dist = state->wsize - state->write;
131 if (dist > copy) dist = copy;
132 zmemcpy(state->window + state->write, strm->next_out - copy, dist);
133 copy -= dist;
134 if (copy) {
135 zmemcpy(state->window, strm->next_out - copy, copy);
136 state->write = copy;
137 state->whave = state->wsize;
138 }
139 else {
140 state->write += dist;
141 if (state->write == state->wsize) state->write = 0;
142 if (state->whave < state->wsize) state->whave += dist;
143 }
144 }
145 return 0;
146}
147
148
149
150
151#ifdef GUNZIP
152# define UPDATE(check, buf, len) \
153 (state->flags ? crc32(check, buf, len) : adler32(check, buf, len))
154#else
155# define UPDATE(check, buf, len) adler32(check, buf, len)
156#endif
157
158
159#ifdef GUNZIP
160# define CRC2(check, word) \
161 do { \
162 hbuf[0] = (unsigned char)(word); \
163 hbuf[1] = (unsigned char)((word) >> 8); \
164 check = crc32(check, hbuf, 2); \
165 } while (0)
166
167# define CRC4(check, word) \
168 do { \
169 hbuf[0] = (unsigned char)(word); \
170 hbuf[1] = (unsigned char)((word) >> 8); \
171 hbuf[2] = (unsigned char)((word) >> 16); \
172 hbuf[3] = (unsigned char)((word) >> 24); \
173 check = crc32(check, hbuf, 4); \
174 } while (0)
175#endif
176
177
178#define LOAD() \
179 do { \
180 put = strm->next_out; \
181 left = strm->avail_out; \
182 next = strm->next_in; \
183 have = strm->avail_in; \
184 hold = state->hold; \
185 bits = state->bits; \
186 } while (0)
187
188
189#define RESTORE() \
190 do { \
191 strm->next_out = put; \
192 strm->avail_out = left; \
193 strm->next_in = next; \
194 strm->avail_in = have; \
195 state->hold = hold; \
196 state->bits = bits; \
197 } while (0)
198
199
200#define INITBITS() \
201 do { \
202 hold = 0; \
203 bits = 0; \
204 } while (0)
205
206
207
208#define PULLBYTE() \
209 do { \
210 if (have == 0) goto inf_leave; \
211 have--; \
212 hold += (unsigned long)(*next++) << bits; \
213 bits += 8; \
214 } while (0)
215
216
217
218#define NEEDBITS(n) \
219 do { \
220 while (bits < (unsigned)(n)) \
221 PULLBYTE(); \
222 } while (0)
223
224
225#define BITS(n) \
226 ((unsigned)hold & ((1U << (n)) - 1))
227
228
229#define DROPBITS(n) \
230 do { \
231 hold >>= (n); \
232 bits -= (unsigned)(n); \
233 } while (0)
234
235
236#define BYTEBITS() \
237 do { \
238 hold >>= bits & 7; \
239 bits -= bits & 7; \
240 } while (0)
241
242
243#define REVERSE(q) \
244 ((((q) >> 24) & 0xff) + (((q) >> 8) & 0xff00) + \
245 (((q) & 0xff00) << 8) + (((q) & 0xff) << 24))
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328int ZEXPORT inflate(z_streamp strm, int flush)
329{
330 struct inflate_state FAR *state;
331 unsigned char FAR *next;
332 unsigned char FAR *put;
333 unsigned have, left;
334 unsigned long hold;
335 unsigned bits;
336 unsigned in, out;
337 unsigned copy;
338 unsigned char FAR *from;
339 code this;
340 code last;
341 unsigned len;
342 int ret;
343#ifdef GUNZIP
344 unsigned char hbuf[4];
345#endif
346 static const unsigned short order[19] =
347 {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15};
348
349 if (strm == Z_NULL || strm->state == Z_NULL ||
350 (strm->next_in == Z_NULL && strm->avail_in != 0))
351 return Z_STREAM_ERROR;
352
353 state = (struct inflate_state FAR *)strm->state;
354 if (state->mode == TYPE) state->mode = TYPEDO;
355 LOAD();
356 in = have;
357 out = left;
358 ret = Z_OK;
359 for (;;)
360 switch (state->mode) {
361 case HEAD:
362 if (state->wrap == 0) {
363 state->mode = TYPEDO;
364 break;
365 }
366 NEEDBITS(16);
367#ifdef GUNZIP
368 if ((state->wrap & 2) && hold == 0x8b1f) {
369 state->check = crc32(0L, Z_NULL, 0);
370 CRC2(state->check, hold);
371 INITBITS();
372 state->mode = FLAGS;
373 break;
374 }
375 state->flags = 0;
376 if (state->head != Z_NULL)
377 state->head->done = -1;
378 if (!(state->wrap & 1) ||
379#else
380 if (
381#endif
382 ((BITS(8) << 8) + (hold >> 8)) % 31) {
383 strm->msg = (char *)"incorrect header check";
384 state->mode = BAD;
385 break;
386 }
387 if (BITS(4) != Z_DEFLATED) {
388 strm->msg = (char *)"unknown compression method";
389 state->mode = BAD;
390 break;
391 }
392 DROPBITS(4);
393 len = BITS(4) + 8;
394 if (len > state->wbits) {
395 strm->msg = (char *)"invalid window size";
396 state->mode = BAD;
397 break;
398 }
399 state->dmax = 1U << len;
400 Tracev((stderr, "inflate: zlib header ok\n"));
401 strm->adler = state->check = adler32(0L, Z_NULL, 0);
402 state->mode = hold & 0x200 ? DICTID : TYPE;
403 INITBITS();
404 break;
405#ifdef GUNZIP
406 case FLAGS:
407 NEEDBITS(16);
408 state->flags = (int)(hold);
409 if ((state->flags & 0xff) != Z_DEFLATED) {
410 strm->msg = (char *)"unknown compression method";
411 state->mode = BAD;
412 break;
413 }
414 if (state->flags & 0xe000) {
415 strm->msg = (char *)"unknown header flags set";
416 state->mode = BAD;
417 break;
418 }
419 if (state->head != Z_NULL)
420 state->head->text = (int)((hold >> 8) & 1);
421 if (state->flags & 0x0200) CRC2(state->check, hold);
422 INITBITS();
423 state->mode = TIME;
424 case TIME:
425 NEEDBITS(32);
426 if (state->head != Z_NULL)
427 state->head->time = hold;
428 if (state->flags & 0x0200) CRC4(state->check, hold);
429 INITBITS();
430 state->mode = OS;
431 case OS:
432 NEEDBITS(16);
433 if (state->head != Z_NULL) {
434 state->head->xflags = (int)(hold & 0xff);
435 state->head->os = (int)(hold >> 8);
436 }
437 if (state->flags & 0x0200) CRC2(state->check, hold);
438 INITBITS();
439 state->mode = EXLEN;
440 case EXLEN:
441 if (state->flags & 0x0400) {
442 NEEDBITS(16);
443 state->length = (unsigned)(hold);
444 if (state->head != Z_NULL)
445 state->head->extra_len = (unsigned)hold;
446 if (state->flags & 0x0200) CRC2(state->check, hold);
447 INITBITS();
448 }
449 else if (state->head != Z_NULL)
450 state->head->extra = Z_NULL;
451 state->mode = EXTRA;
452 case EXTRA:
453 if (state->flags & 0x0400) {
454 copy = state->length;
455 if (copy > have) copy = have;
456 if (copy) {
457 if (state->head != Z_NULL &&
458 state->head->extra != Z_NULL) {
459 len = state->head->extra_len - state->length;
460 zmemcpy(state->head->extra + len, next,
461 len + copy > state->head->extra_max ?
462 state->head->extra_max - len : copy);
463 }
464 if (state->flags & 0x0200)
465 state->check = crc32(state->check, next, copy);
466 have -= copy;
467 next += copy;
468 state->length -= copy;
469 }
470 if (state->length) goto inf_leave;
471 }
472 state->length = 0;
473 state->mode = NAME;
474 case NAME:
475 if (state->flags & 0x0800) {
476 if (have == 0) goto inf_leave;
477 copy = 0;
478 do {
479 len = (unsigned)(next[copy++]);
480 if (state->head != Z_NULL &&
481 state->head->name != Z_NULL &&
482 state->length < state->head->name_max)
483 state->head->name[state->length++] = len;
484 } while (len && copy < have);
485 if (state->flags & 0x0200)
486 state->check = crc32(state->check, next, copy);
487 have -= copy;
488 next += copy;
489 if (len) goto inf_leave;
490 }
491 else if (state->head != Z_NULL)
492 state->head->name = Z_NULL;
493 state->length = 0;
494 state->mode = COMMENT;
495 case COMMENT:
496 if (state->flags & 0x1000) {
497 if (have == 0) goto inf_leave;
498 copy = 0;
499 do {
500 len = (unsigned)(next[copy++]);
501 if (state->head != Z_NULL &&
502 state->head->comment != Z_NULL &&
503 state->length < state->head->comm_max)
504 state->head->comment[state->length++] = len;
505 } while (len && copy < have);
506 if (state->flags & 0x0200)
507 state->check = crc32(state->check, next, copy);
508 have -= copy;
509 next += copy;
510 if (len) goto inf_leave;
511 }
512 else if (state->head != Z_NULL)
513 state->head->comment = Z_NULL;
514 state->mode = HCRC;
515 case HCRC:
516 if (state->flags & 0x0200) {
517 NEEDBITS(16);
518 if (hold != (state->check & 0xffff)) {
519 strm->msg = (char *)"header crc mismatch";
520 state->mode = BAD;
521 break;
522 }
523 INITBITS();
524 }
525 if (state->head != Z_NULL) {
526 state->head->hcrc = (int)((state->flags >> 9) & 1);
527 state->head->done = 1;
528 }
529 strm->adler = state->check = crc32(0L, Z_NULL, 0);
530 state->mode = TYPE;
531 break;
532#endif
533 case DICTID:
534 NEEDBITS(32);
535 strm->adler = state->check = REVERSE(hold);
536 INITBITS();
537 state->mode = DICT;
538 case DICT:
539 if (state->havedict == 0) {
540 RESTORE();
541 return Z_NEED_DICT;
542 }
543 strm->adler = state->check = adler32(0L, Z_NULL, 0);
544 state->mode = TYPE;
545 case TYPE:
546 WATCHDOG_RESET();
547 if (flush == Z_BLOCK) goto inf_leave;
548 case TYPEDO:
549 if (state->last) {
550 BYTEBITS();
551 state->mode = CHECK;
552 break;
553 }
554 NEEDBITS(3);
555 state->last = BITS(1);
556 DROPBITS(1);
557 switch (BITS(2)) {
558 case 0:
559 Tracev((stderr, "inflate: stored block%s\n",
560 state->last ? " (last)" : ""));
561 state->mode = STORED;
562 break;
563 case 1:
564 fixedtables(state);
565 Tracev((stderr, "inflate: fixed codes block%s\n",
566 state->last ? " (last)" : ""));
567 state->mode = LEN;
568 break;
569 case 2:
570 Tracev((stderr, "inflate: dynamic codes block%s\n",
571 state->last ? " (last)" : ""));
572 state->mode = TABLE;
573 break;
574 case 3:
575 strm->msg = (char *)"invalid block type";
576 state->mode = BAD;
577 }
578 DROPBITS(2);
579 break;
580 case STORED:
581 BYTEBITS();
582 NEEDBITS(32);
583 if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) {
584 strm->msg = (char *)"invalid stored block lengths";
585 state->mode = BAD;
586 break;
587 }
588 state->length = (unsigned)hold & 0xffff;
589 Tracev((stderr, "inflate: stored length %u\n",
590 state->length));
591 INITBITS();
592 state->mode = COPY;
593 case COPY:
594 copy = state->length;
595 if (copy) {
596 if (copy > have) copy = have;
597 if (copy > left) copy = left;
598 if (copy == 0) goto inf_leave;
599 zmemcpy(put, next, copy);
600 have -= copy;
601 next += copy;
602 left -= copy;
603 put += copy;
604 state->length -= copy;
605 break;
606 }
607 Tracev((stderr, "inflate: stored end\n"));
608 state->mode = TYPE;
609 break;
610 case TABLE:
611 NEEDBITS(14);
612 state->nlen = BITS(5) + 257;
613 DROPBITS(5);
614 state->ndist = BITS(5) + 1;
615 DROPBITS(5);
616 state->ncode = BITS(4) + 4;
617 DROPBITS(4);
618#ifndef PKZIP_BUG_WORKAROUND
619 if (state->nlen > 286 || state->ndist > 30) {
620 strm->msg = (char *)"too many length or distance symbols";
621 state->mode = BAD;
622 break;
623 }
624#endif
625 Tracev((stderr, "inflate: table sizes ok\n"));
626 state->have = 0;
627 state->mode = LENLENS;
628 case LENLENS:
629 while (state->have < state->ncode) {
630 NEEDBITS(3);
631 state->lens[order[state->have++]] = (unsigned short)BITS(3);
632 DROPBITS(3);
633 }
634 while (state->have < 19)
635 state->lens[order[state->have++]] = 0;
636 state->next = state->codes;
637 state->lencode = (code const FAR *)(state->next);
638 state->lenbits = 7;
639 ret = inflate_table(CODES, state->lens, 19, &(state->next),
640 &(state->lenbits), state->work);
641 if (ret) {
642 strm->msg = (char *)"invalid code lengths set";
643 state->mode = BAD;
644 break;
645 }
646 Tracev((stderr, "inflate: code lengths ok\n"));
647 state->have = 0;
648 state->mode = CODELENS;
649 case CODELENS:
650 while (state->have < state->nlen + state->ndist) {
651 for (;;) {
652 this = state->lencode[BITS(state->lenbits)];
653 if ((unsigned)(this.bits) <= bits) break;
654 PULLBYTE();
655 }
656 if (this.val < 16) {
657 NEEDBITS(this.bits);
658 DROPBITS(this.bits);
659 state->lens[state->have++] = this.val;
660 }
661 else {
662 if (this.val == 16) {
663 NEEDBITS(this.bits + 2);
664 DROPBITS(this.bits);
665 if (state->have == 0) {
666 strm->msg = (char *)"invalid bit length repeat";
667 state->mode = BAD;
668 break;
669 }
670 len = state->lens[state->have - 1];
671 copy = 3 + BITS(2);
672 DROPBITS(2);
673 }
674 else if (this.val == 17) {
675 NEEDBITS(this.bits + 3);
676 DROPBITS(this.bits);
677 len = 0;
678 copy = 3 + BITS(3);
679 DROPBITS(3);
680 }
681 else {
682 NEEDBITS(this.bits + 7);
683 DROPBITS(this.bits);
684 len = 0;
685 copy = 11 + BITS(7);
686 DROPBITS(7);
687 }
688 if (state->have + copy > state->nlen + state->ndist) {
689 strm->msg = (char *)"invalid bit length repeat";
690 state->mode = BAD;
691 break;
692 }
693 while (copy--)
694 state->lens[state->have++] = (unsigned short)len;
695 }
696 }
697
698
699 if (state->mode == BAD) break;
700
701
702 state->next = state->codes;
703 state->lencode = (code const FAR *)(state->next);
704 state->lenbits = 9;
705 ret = inflate_table(LENS, state->lens, state->nlen, &(state->next),
706 &(state->lenbits), state->work);
707 if (ret) {
708 strm->msg = (char *)"invalid literal/lengths set";
709 state->mode = BAD;
710 break;
711 }
712 state->distcode = (code const FAR *)(state->next);
713 state->distbits = 6;
714 ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist,
715 &(state->next), &(state->distbits), state->work);
716 if (ret) {
717 strm->msg = (char *)"invalid distances set";
718 state->mode = BAD;
719 break;
720 }
721 Tracev((stderr, "inflate: codes ok\n"));
722 state->mode = LEN;
723 case LEN:
724 WATCHDOG_RESET();
725 if (have >= 6 && left >= 258) {
726 RESTORE();
727 inflate_fast(strm, out);
728 LOAD();
729 break;
730 }
731 for (;;) {
732 this = state->lencode[BITS(state->lenbits)];
733 if ((unsigned)(this.bits) <= bits) break;
734 PULLBYTE();
735 }
736 if (this.op && (this.op & 0xf0) == 0) {
737 last = this;
738 for (;;) {
739 this = state->lencode[last.val +
740 (BITS(last.bits + last.op) >> last.bits)];
741 if ((unsigned)(last.bits + this.bits) <= bits) break;
742 PULLBYTE();
743 }
744 DROPBITS(last.bits);
745 }
746 DROPBITS(this.bits);
747 state->length = (unsigned)this.val;
748 if ((int)(this.op) == 0) {
749 Tracevv((stderr, this.val >= 0x20 && this.val < 0x7f ?
750 "inflate: literal '%c'\n" :
751 "inflate: literal 0x%02x\n", this.val));
752 state->mode = LIT;
753 break;
754 }
755 if (this.op & 32) {
756 Tracevv((stderr, "inflate: end of block\n"));
757 state->mode = TYPE;
758 break;
759 }
760 if (this.op & 64) {
761 strm->msg = (char *)"invalid literal/length code";
762 state->mode = BAD;
763 break;
764 }
765 state->extra = (unsigned)(this.op) & 15;
766 state->mode = LENEXT;
767 case LENEXT:
768 if (state->extra) {
769 NEEDBITS(state->extra);
770 state->length += BITS(state->extra);
771 DROPBITS(state->extra);
772 }
773 Tracevv((stderr, "inflate: length %u\n", state->length));
774 state->mode = DIST;
775 case DIST:
776 for (;;) {
777 this = state->distcode[BITS(state->distbits)];
778 if ((unsigned)(this.bits) <= bits) break;
779 PULLBYTE();
780 }
781 if ((this.op & 0xf0) == 0) {
782 last = this;
783 for (;;) {
784 this = state->distcode[last.val +
785 (BITS(last.bits + last.op) >> last.bits)];
786 if ((unsigned)(last.bits + this.bits) <= bits) break;
787 PULLBYTE();
788 }
789 DROPBITS(last.bits);
790 }
791 DROPBITS(this.bits);
792 if (this.op & 64) {
793 strm->msg = (char *)"invalid distance code";
794 state->mode = BAD;
795 break;
796 }
797 state->offset = (unsigned)this.val;
798 state->extra = (unsigned)(this.op) & 15;
799 state->mode = DISTEXT;
800 case DISTEXT:
801 if (state->extra) {
802 NEEDBITS(state->extra);
803 state->offset += BITS(state->extra);
804 DROPBITS(state->extra);
805 }
806#ifdef INFLATE_STRICT
807 if (state->offset > state->dmax) {
808 strm->msg = (char *)"invalid distance too far back";
809 state->mode = BAD;
810 break;
811 }
812#endif
813 if (state->offset > state->whave + out - left) {
814 strm->msg = (char *)"invalid distance too far back";
815 state->mode = BAD;
816 break;
817 }
818 Tracevv((stderr, "inflate: distance %u\n", state->offset));
819 state->mode = MATCH;
820 case MATCH:
821 if (left == 0) goto inf_leave;
822 copy = out - left;
823 if (state->offset > copy) {
824 copy = state->offset - copy;
825 if (copy > state->write) {
826 copy -= state->write;
827 from = state->window + (state->wsize - copy);
828 }
829 else
830 from = state->window + (state->write - copy);
831 if (copy > state->length) copy = state->length;
832 }
833 else {
834 from = put - state->offset;
835 copy = state->length;
836 }
837 if (copy > left) copy = left;
838 left -= copy;
839 state->length -= copy;
840 do {
841 *put++ = *from++;
842 } while (--copy);
843 if (state->length == 0) state->mode = LEN;
844 break;
845 case LIT:
846 if (left == 0) goto inf_leave;
847 *put++ = (unsigned char)(state->length);
848 left--;
849 state->mode = LEN;
850 break;
851 case CHECK:
852 if (state->wrap) {
853 NEEDBITS(32);
854 out -= left;
855 strm->total_out += out;
856 state->total += out;
857 if (out)
858 strm->adler = state->check =
859 UPDATE(state->check, put - out, out);
860 out = left;
861 if ((
862#ifdef GUNZIP
863 state->flags ? hold :
864#endif
865 REVERSE(hold)) != state->check) {
866 strm->msg = (char *)"incorrect data check";
867 state->mode = BAD;
868 break;
869 }
870 INITBITS();
871 Tracev((stderr, "inflate: check matches trailer\n"));
872 }
873#ifdef GUNZIP
874 state->mode = LENGTH;
875 case LENGTH:
876 if (state->wrap && state->flags) {
877 NEEDBITS(32);
878 if (hold != (state->total & 0xffffffffUL)) {
879 strm->msg = (char *)"incorrect length check";
880 state->mode = BAD;
881 break;
882 }
883 INITBITS();
884 Tracev((stderr, "inflate: length matches trailer\n"));
885 }
886#endif
887 state->mode = DONE;
888 case DONE:
889 ret = Z_STREAM_END;
890 goto inf_leave;
891 case BAD:
892 ret = Z_DATA_ERROR;
893 goto inf_leave;
894 case MEM:
895 return Z_MEM_ERROR;
896 case SYNC:
897 default:
898 return Z_STREAM_ERROR;
899 }
900
901
902
903
904
905
906
907 inf_leave:
908 RESTORE();
909 if (state->wsize || (state->mode < CHECK && out != strm->avail_out))
910 if (updatewindow(strm, out)) {
911 state->mode = MEM;
912 return Z_MEM_ERROR;
913 }
914 in -= strm->avail_in;
915 out -= strm->avail_out;
916 strm->total_in += in;
917 strm->total_out += out;
918 state->total += out;
919 if (state->wrap && out)
920 strm->adler = state->check =
921 UPDATE(state->check, strm->next_out - out, out);
922 strm->data_type = state->bits + (state->last ? 64 : 0) +
923 (state->mode == TYPE ? 128 : 0);
924 if (((in == 0 && out == 0) || flush == Z_FINISH) && ret == Z_OK)
925 ret = Z_BUF_ERROR;
926 return ret;
927}
928
929int ZEXPORT inflateEnd(z_streamp strm)
930{
931 struct inflate_state FAR *state;
932 if (strm == Z_NULL || strm->state == Z_NULL || strm->zfree == (free_func)0)
933 return Z_STREAM_ERROR;
934 state = (struct inflate_state FAR *)strm->state;
935 if (state->window != Z_NULL) {
936 WATCHDOG_RESET();
937 ZFREE(strm, state->window);
938 }
939 ZFREE(strm, strm->state);
940 strm->state = Z_NULL;
941 Tracev((stderr, "inflate: end\n"));
942 return Z_OK;
943}
944