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