uboot/lib/zlib/inflate.c
<<
>>
Prefs
   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 */
   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;        /* to support ill-conceived Java test suite */
  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;                 /* in case we return an error */
  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   Update the window with the last wsize (normally 32K) bytes written before
  88   returning.  If window does not exist yet, create it.  This is only called
  89   when a window is already in use, or when output has been written during this
  90   inflate call, but the end of the deflate stream has not been reached yet.
  91   It is also called to create a window for dictionary data when a dictionary
  92   is loaded.
  93
  94   Providing output buffers larger than 32K to inflate() should provide a speed
  95   advantage, since only the last 32K of output is copied to the sliding window
  96   upon return from inflate(), and since all distances after the first 32K of
  97   output will fall in the output data, making match copies simpler and faster.
  98   The advantage may be dependent on the size of the processor's data caches.
  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    /* if it hasn't been done already, allocate space for the window */
 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    /* if window not in use yet, initialize */
 116    if (state->wsize == 0) {
 117        state->wsize = 1U << state->wbits;
 118        state->write = 0;
 119        state->whave = 0;
 120    }
 121
 122    /* copy state->wsize or less output bytes into the circular window */
 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/* Macros for inflate(): */
 149
 150/* check function to use adler32() for zlib or crc32() for gzip */
 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/* check macros for header crc */
 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/* Load registers with state in inflate() for speed */
 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/* Restore state from registers in inflate() */
 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/* Clear the input bit accumulator */
 200#define INITBITS() \
 201    do { \
 202        hold = 0; \
 203        bits = 0; \
 204    } while (0)
 205
 206/* Get a byte of input into the bit accumulator, or return from inflate()
 207   if there is no input available. */
 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/* Assure that there are at least n bits in the bit accumulator.  If there is
 217   not enough available input to do that, then return from inflate(). */
 218#define NEEDBITS(n) \
 219    do { \
 220        while (bits < (unsigned)(n)) \
 221            PULLBYTE(); \
 222    } while (0)
 223
 224/* Return the low n bits of the bit accumulator (n < 16) */
 225#define BITS(n) \
 226    ((unsigned)hold & ((1U << (n)) - 1))
 227
 228/* Remove n bits from the bit accumulator */
 229#define DROPBITS(n) \
 230    do { \
 231        hold >>= (n); \
 232        bits -= (unsigned)(n); \
 233    } while (0)
 234
 235/* Remove zero to seven bits as needed to go to a byte boundary */
 236#define BYTEBITS() \
 237    do { \
 238        hold >>= bits & 7; \
 239        bits -= bits & 7; \
 240    } while (0)
 241
 242/* Reverse the bytes in a 32-bit value */
 243#define REVERSE(q) \
 244    ((((q) >> 24) & 0xff) + (((q) >> 8) & 0xff00) + \
 245     (((q) & 0xff00) << 8) + (((q) & 0xff) << 24))
 246
 247/*
 248   inflate() uses a state machine to process as much input data and generate as
 249   much output data as possible before returning.  The state machine is
 250   structured roughly as follows:
 251
 252    for (;;) switch (state) {
 253    ...
 254    case STATEn:
 255        if (not enough input data or output space to make progress)
 256            return;
 257        ... make progress ...
 258        state = STATEm;
 259        break;
 260    ...
 261    }
 262
 263   so when inflate() is called again, the same case is attempted again, and
 264   if the appropriate resources are provided, the machine proceeds to the
 265   next state.  The NEEDBITS() macro is usually the way the state evaluates
 266   whether it can proceed or should return.  NEEDBITS() does the return if
 267   the requested bits are not available.  The typical use of the BITS macros
 268   is:
 269
 270        NEEDBITS(n);
 271        ... do something with BITS(n) ...
 272        DROPBITS(n);
 273
 274   where NEEDBITS(n) either returns from inflate() if there isn't enough
 275   input left to load n bits into the accumulator, or it continues.  BITS(n)
 276   gives the low n bits in the accumulator.  When done, DROPBITS(n) drops
 277   the low n bits off the accumulator.  INITBITS() clears the accumulator
 278   and sets the number of available bits to zero.  BYTEBITS() discards just
 279   enough bits to put the accumulator on a byte boundary.  After BYTEBITS()
 280   and a NEEDBITS(8), then BITS(8) would return the next byte in the stream.
 281
 282   NEEDBITS(n) uses PULLBYTE() to get an available byte of input, or to return
 283   if there is no input available.  The decoding of variable length codes uses
 284   PULLBYTE() directly in order to pull just enough bytes to decode the next
 285   code, and no more.
 286
 287   Some states loop until they get enough input, making sure that enough
 288   state information is maintained to continue the loop where it left off
 289   if NEEDBITS() returns in the loop.  For example, want, need, and keep
 290   would all have to actually be part of the saved state in case NEEDBITS()
 291   returns:
 292
 293    case STATEw:
 294        while (want < need) {
 295            NEEDBITS(n);
 296            keep[want++] = BITS(n);
 297            DROPBITS(n);
 298        }
 299        state = STATEx;
 300    case STATEx:
 301
 302   As shown above, if the next state is also the next case, then the break
 303   is omitted.
 304
 305   A state may also return if there is not enough output space available to
 306   complete that state.  Those states are copying stored data, writing a
 307   literal byte, and copying a matching string.
 308
 309   When returning, a "goto inf_leave" is used to update the total counters,
 310   update the check value, and determine whether any progress has been made
 311   during that inflate() call in order to return the proper return code.
 312   Progress is defined as a change in either strm->avail_in or strm->avail_out.
 313   When there is a window, goto inf_leave will update the window with the last
 314   output written.  If a goto inf_leave occurs in the middle of decompression
 315   and there is no window currently, goto inf_leave will create one and copy
 316   output to the window for the next call of inflate().
 317
 318   In this implementation, the flush parameter of inflate() only affects the
 319   return code (per zlib.h).  inflate() always writes as much as possible to
 320   strm->next_out, given the space available and the provided input--the effect
 321   documented in zlib.h of Z_SYNC_FLUSH.  Furthermore, inflate() always defers
 322   the allocation of and copying into a sliding window until necessary, which
 323   provides the effect documented in zlib.h for Z_FINISH when the entire input
 324   stream available.  So the only thing the flush parameter actually does is:
 325   when flush is set to Z_FINISH, inflate() cannot return Z_OK.  Instead it
 326   will return Z_BUF_ERROR if it has not reached the end of the stream.
 327 */
 328int ZEXPORT inflate(z_streamp strm, int flush)
 329{
 330    struct inflate_state FAR *state;
 331    unsigned char FAR *next;    /* next input */
 332    unsigned char FAR *put;     /* next output */
 333    unsigned have, left;        /* available input and output */
 334    unsigned long hold;         /* bit buffer */
 335    unsigned bits;              /* bits in bit buffer */
 336    unsigned in, out;           /* save starting available input and output */
 337    unsigned copy;              /* number of stored or match bytes to copy */
 338    unsigned char FAR *from;    /* where to copy match bytes from */
 339    code this;                  /* current decoding table entry */
 340    code last;                  /* parent table entry */
 341    unsigned len;               /* length to copy for repeats, bits to drop */
 342    int ret;                    /* return code */
 343#ifdef GUNZIP
 344    unsigned char hbuf[4];      /* buffer for gzip header crc calculation */
 345#endif
 346    static const unsigned short order[19] = /* permutation of code lengths */
 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;      /* skip check */
 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) {  /* gzip header */
 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;           /* expect zlib header */
 376            if (state->head != Z_NULL)
 377                state->head->done = -1;
 378            if (!(state->wrap & 1) ||   /* check if zlib header allowed */
 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:                             /* stored block */
 559                Tracev((stderr, "inflate:     stored block%s\n",
 560                        state->last ? " (last)" : ""));
 561                state->mode = STORED;
 562                break;
 563            case 1:                             /* fixed block */
 564                fixedtables(state);
 565                Tracev((stderr, "inflate:     fixed codes block%s\n",
 566                        state->last ? " (last)" : ""));
 567                state->mode = LEN;              /* decode codes */
 568                break;
 569            case 2:                             /* dynamic block */
 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();                         /* go to byte boundary */
 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            /* handle error breaks in while */
 699            if (state->mode == BAD) break;
 700
 701            /* build code tables */
 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) {         /* copy from window */
 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 {                              /* copy from output */
 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       Return from inflate(), updating the total counts and the check value.
 903       If there was no progress during the inflate() call, return a buffer
 904       error.  Call updatewindow() to create and/or update the window state.
 905       Note: a memory error from inflate() is non-recoverable.
 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