Coverage Report

Created: 2026-04-29 07:28

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/zlib-1.2.11/inflate.c
Line
Count
Source
1
/* inflate.c -- zlib decompression
2
 * Copyright (C) 1995-2016 Mark Adler
3
 * For conditions of distribution and use, see copyright notice in zlib.h
4
 */
5
6
/*
7
 * Change history:
8
 *
9
 * 1.2.beta0    24 Nov 2002
10
 * - First version -- complete rewrite of inflate to simplify code, avoid
11
 *   creation of window when not needed, minimize use of window when it is
12
 *   needed, make inffast.c even faster, implement gzip decoding, and to
13
 *   improve code readability and style over the previous zlib inflate code
14
 *
15
 * 1.2.beta1    25 Nov 2002
16
 * - Use pointers for available input and output checking in inffast.c
17
 * - Remove input and output counters in inffast.c
18
 * - Change inffast.c entry and loop from avail_in >= 7 to >= 6
19
 * - Remove unnecessary second byte pull from length extra in inffast.c
20
 * - Unroll direct copy to three copies per loop in inffast.c
21
 *
22
 * 1.2.beta2    4 Dec 2002
23
 * - Change external routine names to reduce potential conflicts
24
 * - Correct filename to inffixed.h for fixed tables in inflate.c
25
 * - Make hbuf[] unsigned char to match parameter type in inflate.c
26
 * - Change strm->next_out[-state->offset] to *(strm->next_out - state->offset)
27
 *   to avoid negation problem on Alphas (64 bit) in inflate.c
28
 *
29
 * 1.2.beta3    22 Dec 2002
30
 * - Add comments on state->bits assertion in inffast.c
31
 * - Add comments on op field in inftrees.h
32
 * - Fix bug in reuse of allocated window after inflateReset()
33
 * - Remove bit fields--back to byte structure for speed
34
 * - Remove distance extra == 0 check in inflate_fast()--only helps for lengths
35
 * - Change post-increments to pre-increments in inflate_fast(), PPC biased?
36
 * - Add compile time option, POSTINC, to use post-increments instead (Intel?)
37
 * - Make MATCH copy in inflate() much faster for when inflate_fast() not used
38
 * - Use local copies of stream next and avail values, as well as local bit
39
 *   buffer and bit count in inflate()--for speed when inflate_fast() not used
40
 *
41
 * 1.2.beta4    1 Jan 2003
42
 * - Split ptr - 257 statements in inflate_table() to avoid compiler warnings
43
 * - Move a comment on output buffer sizes from inffast.c to inflate.c
44
 * - Add comments in inffast.c to introduce the inflate_fast() routine
45
 * - Rearrange window copies in inflate_fast() for speed and simplification
46
 * - Unroll last copy for window match in inflate_fast()
47
 * - Use local copies of window variables in inflate_fast() for speed
48
 * - Pull out common wnext == 0 case for speed in inflate_fast()
49
 * - Make op and len in inflate_fast() unsigned for consistency
50
 * - Add FAR to lcode and dcode declarations in inflate_fast()
51
 * - Simplified bad distance check in inflate_fast()
52
 * - Added inflateBackInit(), inflateBack(), and inflateBackEnd() in new
53
 *   source file infback.c to provide a call-back interface to inflate for
54
 *   programs like gzip and unzip -- uses window as output buffer to avoid
55
 *   window copying
56
 *
57
 * 1.2.beta5    1 Jan 2003
58
 * - Improved inflateBack() interface to allow the caller to provide initial
59
 *   input in strm.
60
 * - Fixed stored blocks bug in inflateBack()
61
 *
62
 * 1.2.beta6    4 Jan 2003
63
 * - Added comments in inffast.c on effectiveness of POSTINC
64
 * - Typecasting all around to reduce compiler warnings
65
 * - Changed loops from while (1) or do {} while (1) to for (;;), again to
66
 *   make compilers happy
67
 * - Changed type of window in inflateBackInit() to unsigned char *
68
 *
69
 * 1.2.beta7    27 Jan 2003
70
 * - Changed many types to unsigned or unsigned short to avoid warnings
71
 * - Added inflateCopy() function
72
 *
73
 * 1.2.0        9 Mar 2003
74
 * - Changed inflateBack() interface to provide separate opaque descriptors
75
 *   for the in() and out() functions
76
 * - Changed inflateBack() argument and in_func typedef to swap the length
77
 *   and buffer address return values for the input function
78
 * - Check next_in and next_out for Z_NULL on entry to inflate()
79
 *
80
 * The history for versions after 1.2.0 are in ChangeLog in zlib distribution.
81
 */
82
83
#include "zutil.h"
84
#include "inftrees.h"
85
#include "inflate.h"
86
#include "inffast.h"
87
88
#ifdef MAKEFIXED
89
#  ifndef BUILDFIXED
90
#    define BUILDFIXED
91
#  endif
92
#endif
93
94
/* function prototypes */
95
local int inflateStateCheck OF((z_streamp strm));
96
local void fixedtables OF((struct inflate_state FAR *state));
97
local int updatewindow OF((z_streamp strm, const unsigned char FAR *end,
98
                           unsigned copy));
99
#ifdef BUILDFIXED
100
   void makefixed OF((void));
101
#endif
102
local unsigned syncsearch OF((unsigned FAR *have, const unsigned char FAR *buf,
103
                              unsigned len));
104
105
local int inflateStateCheck(strm)
106
z_streamp strm;
107
3.82M
{
108
3.82M
    struct inflate_state FAR *state;
109
3.82M
    if (strm == Z_NULL ||
110
3.82M
        strm->zalloc == (alloc_func)0 || strm->zfree == (free_func)0)
111
0
        return 1;
112
3.82M
    state = (struct inflate_state FAR *)strm->state;
113
3.82M
    if (state == Z_NULL || state->strm != strm ||
114
3.82M
        state->mode < HEAD || state->mode > SYNC)
115
0
        return 1;
116
3.82M
    return 0;
117
3.82M
}
118
119
int ZEXPORT inflateResetKeep(strm)
120
z_streamp strm;
121
518k
{
122
518k
    struct inflate_state FAR *state;
123
124
518k
    if (inflateStateCheck(strm)) return Z_STREAM_ERROR;
125
518k
    state = (struct inflate_state FAR *)strm->state;
126
518k
    strm->total_in = strm->total_out = state->total = 0;
127
518k
    strm->msg = Z_NULL;
128
518k
    if (state->wrap)        /* to support ill-conceived Java test suite */
129
142k
        strm->adler = state->wrap & 1;
130
518k
    state->mode = HEAD;
131
518k
    state->last = 0;
132
518k
    state->havedict = 0;
133
518k
    state->dmax = 32768U;
134
518k
    state->head = Z_NULL;
135
518k
    state->hold = 0;
136
518k
    state->bits = 0;
137
518k
    state->lencode = state->distcode = state->next = state->codes;
138
518k
    state->sane = 1;
139
518k
    state->back = -1;
140
518k
    Tracev((stderr, "inflate: reset\n"));
141
518k
    return Z_OK;
142
518k
}
143
144
int ZEXPORT inflateReset(strm)
145
z_streamp strm;
146
518k
{
147
518k
    struct inflate_state FAR *state;
148
149
518k
    if (inflateStateCheck(strm)) return Z_STREAM_ERROR;
150
518k
    state = (struct inflate_state FAR *)strm->state;
151
518k
    state->wsize = 0;
152
518k
    state->whave = 0;
153
518k
    state->wnext = 0;
154
518k
    return inflateResetKeep(strm);
155
518k
}
156
157
int ZEXPORT inflateReset2(strm, windowBits)
158
z_streamp strm;
159
int windowBits;
160
518k
{
161
518k
    int wrap;
162
518k
    struct inflate_state FAR *state;
163
164
    /* get the state */
165
518k
    if (inflateStateCheck(strm)) return Z_STREAM_ERROR;
166
518k
    state = (struct inflate_state FAR *)strm->state;
167
168
    /* extract wrap request from windowBits parameter */
169
518k
    if (windowBits < 0) {
170
375k
        wrap = 0;
171
375k
        windowBits = -windowBits;
172
375k
    }
173
142k
    else {
174
142k
        wrap = (windowBits >> 4) + 5;
175
142k
#ifdef GUNZIP
176
142k
        if (windowBits < 48)
177
142k
            windowBits &= 15;
178
142k
#endif
179
142k
    }
180
181
    /* set number of window bits, free window if different */
182
518k
    if (windowBits && (windowBits < 8 || windowBits > 15))
183
0
        return Z_STREAM_ERROR;
184
518k
    if (state->window != Z_NULL && state->wbits != (unsigned)windowBits) {
185
0
        ZFREE(strm, state->window);
186
0
        state->window = Z_NULL;
187
0
    }
188
189
    /* update state and reset the rest of it */
190
518k
    state->wrap = wrap;
191
518k
    state->wbits = (unsigned)windowBits;
192
518k
    return inflateReset(strm);
193
518k
}
194
195
int ZEXPORT inflateInit2_(strm, windowBits, version, stream_size)
196
z_streamp strm;
197
int windowBits;
198
const char *version;
199
int stream_size;
200
518k
{
201
518k
    int ret;
202
518k
    struct inflate_state FAR *state;
203
204
518k
    if (version == Z_NULL || version[0] != ZLIB_VERSION[0] ||
205
518k
        stream_size != (int)(sizeof(z_stream)))
206
0
        return Z_VERSION_ERROR;
207
518k
    if (strm == Z_NULL) return Z_STREAM_ERROR;
208
518k
    strm->msg = Z_NULL;                 /* in case we return an error */
209
518k
    if (strm->zalloc == (alloc_func)0) {
210
#ifdef Z_SOLO
211
        return Z_STREAM_ERROR;
212
#else
213
518k
        strm->zalloc = zcalloc;
214
518k
        strm->opaque = (voidpf)0;
215
518k
#endif
216
518k
    }
217
518k
    if (strm->zfree == (free_func)0)
218
#ifdef Z_SOLO
219
        return Z_STREAM_ERROR;
220
#else
221
518k
        strm->zfree = zcfree;
222
518k
#endif
223
518k
    state = (struct inflate_state FAR *)
224
518k
            ZALLOC(strm, 1, sizeof(struct inflate_state));
225
518k
    if (state == Z_NULL) return Z_MEM_ERROR;
226
518k
    Tracev((stderr, "inflate: allocated\n"));
227
518k
    strm->state = (struct internal_state FAR *)state;
228
518k
    state->strm = strm;
229
518k
    state->window = Z_NULL;
230
518k
    state->mode = HEAD;     /* to pass state test in inflateReset2() */
231
518k
    ret = inflateReset2(strm, windowBits);
232
518k
    if (ret != Z_OK) {
233
0
        ZFREE(strm, state);
234
0
        strm->state = Z_NULL;
235
0
    }
236
518k
    return ret;
237
518k
}
238
239
int ZEXPORT inflateInit_(strm, version, stream_size)
240
z_streamp strm;
241
const char *version;
242
int stream_size;
243
27.8k
{
244
27.8k
    return inflateInit2_(strm, DEF_WBITS, version, stream_size);
245
27.8k
}
246
247
int ZEXPORT inflatePrime(strm, bits, value)
248
z_streamp strm;
249
int bits;
250
int value;
251
0
{
252
0
    struct inflate_state FAR *state;
253
254
0
    if (inflateStateCheck(strm)) return Z_STREAM_ERROR;
255
0
    state = (struct inflate_state FAR *)strm->state;
256
0
    if (bits < 0) {
257
0
        state->hold = 0;
258
0
        state->bits = 0;
259
0
        return Z_OK;
260
0
    }
261
0
    if (bits > 16 || state->bits + (uInt)bits > 32) return Z_STREAM_ERROR;
262
0
    value &= (1L << bits) - 1;
263
0
    state->hold += (unsigned)value << state->bits;
264
0
    state->bits += (uInt)bits;
265
0
    return Z_OK;
266
0
}
267
268
/*
269
   Return state with length and distance decoding tables and index sizes set to
270
   fixed code decoding.  Normally this returns fixed tables from inffixed.h.
271
   If BUILDFIXED is defined, then instead this routine builds the tables the
272
   first time it's called, and returns those tables the first time and
273
   thereafter.  This reduces the size of the code by about 2K bytes, in
274
   exchange for a little execution time.  However, BUILDFIXED should not be
275
   used for threaded applications, since the rewriting of the tables and virgin
276
   may not be thread-safe.
277
 */
278
local void fixedtables(state)
279
struct inflate_state FAR *state;
280
431k
{
281
#ifdef BUILDFIXED
282
    static int virgin = 1;
283
    static code *lenfix, *distfix;
284
    static code fixed[544];
285
286
    /* build fixed huffman tables if first call (may not be thread safe) */
287
    if (virgin) {
288
        unsigned sym, bits;
289
        static code *next;
290
291
        /* literal/length table */
292
        sym = 0;
293
        while (sym < 144) state->lens[sym++] = 8;
294
        while (sym < 256) state->lens[sym++] = 9;
295
        while (sym < 280) state->lens[sym++] = 7;
296
        while (sym < 288) state->lens[sym++] = 8;
297
        next = fixed;
298
        lenfix = next;
299
        bits = 9;
300
        inflate_table(LENS, state->lens, 288, &(next), &(bits), state->work);
301
302
        /* distance table */
303
        sym = 0;
304
        while (sym < 32) state->lens[sym++] = 5;
305
        distfix = next;
306
        bits = 5;
307
        inflate_table(DISTS, state->lens, 32, &(next), &(bits), state->work);
308
309
        /* do this just once */
310
        virgin = 0;
311
    }
312
#else /* !BUILDFIXED */
313
431k
#   include "inffixed.h"
314
431k
#endif /* BUILDFIXED */
315
431k
    state->lencode = lenfix;
316
431k
    state->lenbits = 9;
317
431k
    state->distcode = distfix;
318
431k
    state->distbits = 5;
319
431k
}
320
321
#ifdef MAKEFIXED
322
#include <stdio.h>
323
324
/*
325
   Write out the inffixed.h that is #include'd above.  Defining MAKEFIXED also
326
   defines BUILDFIXED, so the tables are built on the fly.  makefixed() writes
327
   those tables to stdout, which would be piped to inffixed.h.  A small program
328
   can simply call makefixed to do this:
329
330
    void makefixed(void);
331
332
    int main(void)
333
    {
334
        makefixed();
335
        return 0;
336
    }
337
338
   Then that can be linked with zlib built with MAKEFIXED defined and run:
339
340
    a.out > inffixed.h
341
 */
342
void makefixed()
343
{
344
    unsigned low, size;
345
    struct inflate_state state;
346
347
    fixedtables(&state);
348
    puts("    /* inffixed.h -- table for decoding fixed codes");
349
    puts("     * Generated automatically by makefixed().");
350
    puts("     */");
351
    puts("");
352
    puts("    /* WARNING: this file should *not* be used by applications.");
353
    puts("       It is part of the implementation of this library and is");
354
    puts("       subject to change. Applications should only use zlib.h.");
355
    puts("     */");
356
    puts("");
357
    size = 1U << 9;
358
    printf("    static const code lenfix[%u] = {", size);
359
    low = 0;
360
    for (;;) {
361
        if ((low % 7) == 0) printf("\n        ");
362
        printf("{%u,%u,%d}", (low & 127) == 99 ? 64 : state.lencode[low].op,
363
               state.lencode[low].bits, state.lencode[low].val);
364
        if (++low == size) break;
365
        putchar(',');
366
    }
367
    puts("\n    };");
368
    size = 1U << 5;
369
    printf("\n    static const code distfix[%u] = {", size);
370
    low = 0;
371
    for (;;) {
372
        if ((low % 6) == 0) printf("\n        ");
373
        printf("{%u,%u,%d}", state.distcode[low].op, state.distcode[low].bits,
374
               state.distcode[low].val);
375
        if (++low == size) break;
376
        putchar(',');
377
    }
378
    puts("\n    };");
379
}
380
#endif /* MAKEFIXED */
381
382
/*
383
   Update the window with the last wsize (normally 32K) bytes written before
384
   returning.  If window does not exist yet, create it.  This is only called
385
   when a window is already in use, or when output has been written during this
386
   inflate call, but the end of the deflate stream has not been reached yet.
387
   It is also called to create a window for dictionary data when a dictionary
388
   is loaded.
389
390
   Providing output buffers larger than 32K to inflate() should provide a speed
391
   advantage, since only the last 32K of output is copied to the sliding window
392
   upon return from inflate(), and since all distances after the first 32K of
393
   output will fall in the output data, making match copies simpler and faster.
394
   The advantage may be dependent on the size of the processor's data caches.
395
 */
396
local int updatewindow(strm, end, copy)
397
z_streamp strm;
398
const Bytef *end;
399
unsigned copy;
400
1.57M
{
401
1.57M
    struct inflate_state FAR *state;
402
1.57M
    unsigned dist;
403
404
1.57M
    state = (struct inflate_state FAR *)strm->state;
405
406
    /* if it hasn't been done already, allocate space for the window */
407
1.57M
    if (state->window == Z_NULL) {
408
353k
        state->window = (unsigned char FAR *)
409
353k
                        ZALLOC(strm, 1U << state->wbits,
410
353k
                               sizeof(unsigned char));
411
353k
        if (state->window == Z_NULL) return 1;
412
353k
    }
413
414
    /* if window not in use yet, initialize */
415
1.57M
    if (state->wsize == 0) {
416
353k
        state->wsize = 1U << state->wbits;
417
353k
        state->wnext = 0;
418
353k
        state->whave = 0;
419
353k
    }
420
421
    /* copy state->wsize or less output bytes into the circular window */
422
1.57M
    if (copy >= state->wsize) {
423
106k
        zmemcpy(state->window, end - state->wsize, state->wsize);
424
106k
        state->wnext = 0;
425
106k
        state->whave = state->wsize;
426
106k
    }
427
1.46M
    else {
428
1.46M
        dist = state->wsize - state->wnext;
429
1.46M
        if (dist > copy) dist = copy;
430
1.46M
        zmemcpy(state->window + state->wnext, end - copy, dist);
431
1.46M
        copy -= dist;
432
1.46M
        if (copy) {
433
151k
            zmemcpy(state->window, end - copy, copy);
434
151k
            state->wnext = copy;
435
151k
            state->whave = state->wsize;
436
151k
        }
437
1.31M
        else {
438
1.31M
            state->wnext += dist;
439
1.31M
            if (state->wnext == state->wsize) state->wnext = 0;
440
1.31M
            if (state->whave < state->wsize) state->whave += dist;
441
1.31M
        }
442
1.46M
    }
443
1.57M
    return 0;
444
1.57M
}
445
446
/* Macros for inflate(): */
447
448
/* check function to use adler32() for zlib or crc32() for gzip */
449
#ifdef GUNZIP
450
#  define UPDATE(check, buf, len) \
451
667k
    (state->flags ? crc32(check, buf, len) : adler32(check, buf, len))
452
#else
453
#  define UPDATE(check, buf, len) adler32(check, buf, len)
454
#endif
455
456
/* check macros for header crc */
457
#ifdef GUNZIP
458
#  define CRC2(check, word) \
459
5.04k
    do { \
460
5.04k
        hbuf[0] = (unsigned char)(word); \
461
5.04k
        hbuf[1] = (unsigned char)((word) >> 8); \
462
5.04k
        check = crc32(check, hbuf, 2); \
463
5.04k
    } while (0)
464
465
#  define CRC4(check, word) \
466
131
    do { \
467
131
        hbuf[0] = (unsigned char)(word); \
468
131
        hbuf[1] = (unsigned char)((word) >> 8); \
469
131
        hbuf[2] = (unsigned char)((word) >> 16); \
470
131
        hbuf[3] = (unsigned char)((word) >> 24); \
471
131
        check = crc32(check, hbuf, 4); \
472
131
    } while (0)
473
#endif
474
475
/* Load registers with state in inflate() for speed */
476
#define LOAD() \
477
3.33M
    do { \
478
3.33M
        put = strm->next_out; \
479
3.33M
        left = strm->avail_out; \
480
3.33M
        next = strm->next_in; \
481
3.33M
        have = strm->avail_in; \
482
3.33M
        hold = state->hold; \
483
3.33M
        bits = state->bits; \
484
3.33M
    } while (0)
485
486
/* Restore state from registers in inflate() */
487
#define RESTORE() \
488
3.33M
    do { \
489
3.33M
        strm->next_out = put; \
490
3.33M
        strm->avail_out = left; \
491
3.33M
        strm->next_in = next; \
492
3.33M
        strm->avail_in = have; \
493
3.33M
        state->hold = hold; \
494
3.33M
        state->bits = bits; \
495
3.33M
    } while (0)
496
497
/* Clear the input bit accumulator */
498
#define INITBITS() \
499
199k
    do { \
500
199k
        hold = 0; \
501
199k
        bits = 0; \
502
199k
    } while (0)
503
504
/* Get a byte of input into the bit accumulator, or return from inflate()
505
   if there is no input available. */
506
#define PULLBYTE() \
507
10.4M
    do { \
508
10.4M
        if (have == 0) goto inf_leave; \
509
10.4M
        have--; \
510
10.4M
        hold += (unsigned long)(*next++) << bits; \
511
10.4M
        bits += 8; \
512
10.4M
    } while (0)
513
514
/* Assure that there are at least n bits in the bit accumulator.  If there is
515
   not enough available input to do that, then return from inflate(). */
516
#define NEEDBITS(n) \
517
6.13M
    do { \
518
10.0M
        while (bits < (unsigned)(n)) \
519
6.13M
            PULLBYTE(); \
520
6.13M
    } while (0)
521
522
/* Return the low n bits of the bit accumulator (n < 16) */
523
#define BITS(n) \
524
30.9M
    ((unsigned)hold & ((1U << (n)) - 1))
525
526
/* Remove n bits from the bit accumulator */
527
#define DROPBITS(n) \
528
24.1M
    do { \
529
24.1M
        hold >>= (n); \
530
24.1M
        bits -= (unsigned)(n); \
531
24.1M
    } while (0)
532
533
/* Remove zero to seven bits as needed to go to a byte boundary */
534
#define BYTEBITS() \
535
417k
    do { \
536
417k
        hold >>= bits & 7; \
537
417k
        bits -= bits & 7; \
538
417k
    } while (0)
539
540
/*
541
   inflate() uses a state machine to process as much input data and generate as
542
   much output data as possible before returning.  The state machine is
543
   structured roughly as follows:
544
545
    for (;;) switch (state) {
546
    ...
547
    case STATEn:
548
        if (not enough input data or output space to make progress)
549
            return;
550
        ... make progress ...
551
        state = STATEm;
552
        break;
553
    ...
554
    }
555
556
   so when inflate() is called again, the same case is attempted again, and
557
   if the appropriate resources are provided, the machine proceeds to the
558
   next state.  The NEEDBITS() macro is usually the way the state evaluates
559
   whether it can proceed or should return.  NEEDBITS() does the return if
560
   the requested bits are not available.  The typical use of the BITS macros
561
   is:
562
563
        NEEDBITS(n);
564
        ... do something with BITS(n) ...
565
        DROPBITS(n);
566
567
   where NEEDBITS(n) either returns from inflate() if there isn't enough
568
   input left to load n bits into the accumulator, or it continues.  BITS(n)
569
   gives the low n bits in the accumulator.  When done, DROPBITS(n) drops
570
   the low n bits off the accumulator.  INITBITS() clears the accumulator
571
   and sets the number of available bits to zero.  BYTEBITS() discards just
572
   enough bits to put the accumulator on a byte boundary.  After BYTEBITS()
573
   and a NEEDBITS(8), then BITS(8) would return the next byte in the stream.
574
575
   NEEDBITS(n) uses PULLBYTE() to get an available byte of input, or to return
576
   if there is no input available.  The decoding of variable length codes uses
577
   PULLBYTE() directly in order to pull just enough bytes to decode the next
578
   code, and no more.
579
580
   Some states loop until they get enough input, making sure that enough
581
   state information is maintained to continue the loop where it left off
582
   if NEEDBITS() returns in the loop.  For example, want, need, and keep
583
   would all have to actually be part of the saved state in case NEEDBITS()
584
   returns:
585
586
    case STATEw:
587
        while (want < need) {
588
            NEEDBITS(n);
589
            keep[want++] = BITS(n);
590
            DROPBITS(n);
591
        }
592
        state = STATEx;
593
    case STATEx:
594
595
   As shown above, if the next state is also the next case, then the break
596
   is omitted.
597
598
   A state may also return if there is not enough output space available to
599
   complete that state.  Those states are copying stored data, writing a
600
   literal byte, and copying a matching string.
601
602
   When returning, a "goto inf_leave" is used to update the total counters,
603
   update the check value, and determine whether any progress has been made
604
   during that inflate() call in order to return the proper return code.
605
   Progress is defined as a change in either strm->avail_in or strm->avail_out.
606
   When there is a window, goto inf_leave will update the window with the last
607
   output written.  If a goto inf_leave occurs in the middle of decompression
608
   and there is no window currently, goto inf_leave will create one and copy
609
   output to the window for the next call of inflate().
610
611
   In this implementation, the flush parameter of inflate() only affects the
612
   return code (per zlib.h).  inflate() always writes as much as possible to
613
   strm->next_out, given the space available and the provided input--the effect
614
   documented in zlib.h of Z_SYNC_FLUSH.  Furthermore, inflate() always defers
615
   the allocation of and copying into a sliding window until necessary, which
616
   provides the effect documented in zlib.h for Z_FINISH when the entire input
617
   stream available.  So the only thing the flush parameter actually does is:
618
   when flush is set to Z_FINISH, inflate() cannot return Z_OK.  Instead it
619
   will return Z_BUF_ERROR if it has not reached the end of the stream.
620
 */
621
622
int ZEXPORT inflate(strm, flush)
623
z_streamp strm;
624
int flush;
625
1.74M
{
626
1.74M
    struct inflate_state FAR *state;
627
1.74M
    z_const unsigned char FAR *next;    /* next input */
628
1.74M
    unsigned char FAR *put;     /* next output */
629
1.74M
    unsigned have, left;        /* available input and output */
630
1.74M
    unsigned long hold;         /* bit buffer */
631
1.74M
    unsigned bits;              /* bits in bit buffer */
632
1.74M
    unsigned in, out;           /* save starting available input and output */
633
1.74M
    unsigned copy;              /* number of stored or match bytes to copy */
634
1.74M
    unsigned char FAR *from;    /* where to copy match bytes from */
635
1.74M
    code here;                  /* current decoding table entry */
636
1.74M
    code last;                  /* parent table entry */
637
1.74M
    unsigned len;               /* length to copy for repeats, bits to drop */
638
1.74M
    int ret;                    /* return code */
639
1.74M
#ifdef GUNZIP
640
1.74M
    unsigned char hbuf[4];      /* buffer for gzip header crc calculation */
641
1.74M
#endif
642
1.74M
    static const unsigned short order[19] = /* permutation of code lengths */
643
1.74M
        {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15};
644
645
1.74M
    if (inflateStateCheck(strm) || strm->next_out == Z_NULL ||
646
1.74M
        (strm->next_in == Z_NULL && strm->avail_in != 0))
647
0
        return Z_STREAM_ERROR;
648
649
1.74M
    state = (struct inflate_state FAR *)strm->state;
650
1.74M
    if (state->mode == TYPE) state->mode = TYPEDO;      /* skip check */
651
1.74M
    LOAD();
652
1.74M
    in = have;
653
1.74M
    out = left;
654
1.74M
    ret = Z_OK;
655
1.74M
    for (;;)
656
12.6M
        switch (state->mode) {
657
518k
        case HEAD:
658
518k
            if (state->wrap == 0) {
659
375k
                state->mode = TYPEDO;
660
375k
                break;
661
375k
            }
662
142k
            NEEDBITS(16);
663
136k
#ifdef GUNZIP
664
136k
            if ((state->wrap & 2) && hold == 0x8b1f) {  /* gzip header */
665
4.72k
                if (state->wbits == 0)
666
0
                    state->wbits = 15;
667
4.72k
                state->check = crc32(0L, Z_NULL, 0);
668
4.72k
                CRC2(state->check, hold);
669
4.72k
                INITBITS();
670
4.72k
                state->mode = FLAGS;
671
4.72k
                break;
672
4.72k
            }
673
131k
            state->flags = 0;           /* expect zlib header */
674
131k
            if (state->head != Z_NULL)
675
0
                state->head->done = -1;
676
131k
            if (!(state->wrap & 1) ||   /* check if zlib header allowed */
677
#else
678
            if (
679
#endif
680
98.6k
                ((BITS(8) << 8) + (hold >> 8)) % 31) {
681
36.2k
                strm->msg = (char *)"incorrect header check";
682
36.2k
                state->mode = BAD;
683
36.2k
                break;
684
36.2k
            }
685
95.4k
            if (BITS(4) != Z_DEFLATED) {
686
1.88k
                strm->msg = (char *)"unknown compression method";
687
1.88k
                state->mode = BAD;
688
1.88k
                break;
689
1.88k
            }
690
93.5k
            DROPBITS(4);
691
93.5k
            len = BITS(4) + 8;
692
93.5k
            if (state->wbits == 0)
693
0
                state->wbits = len;
694
93.5k
            if (len > 15 || len > state->wbits) {
695
247
                strm->msg = (char *)"invalid window size";
696
247
                state->mode = BAD;
697
247
                break;
698
247
            }
699
93.3k
            state->dmax = 1U << len;
700
93.3k
            Tracev((stderr, "inflate:   zlib header ok\n"));
701
93.3k
            strm->adler = state->check = adler32(0L, Z_NULL, 0);
702
93.3k
            state->mode = hold & 0x200 ? DICTID : TYPE;
703
93.3k
            INITBITS();
704
93.3k
            break;
705
0
#ifdef GUNZIP
706
4.72k
        case FLAGS:
707
4.72k
            NEEDBITS(16);
708
4.71k
            state->flags = (int)(hold);
709
4.71k
            if ((state->flags & 0xff) != Z_DEFLATED) {
710
7
                strm->msg = (char *)"unknown compression method";
711
7
                state->mode = BAD;
712
7
                break;
713
7
            }
714
4.71k
            if (state->flags & 0xe000) {
715
3
                strm->msg = (char *)"unknown header flags set";
716
3
                state->mode = BAD;
717
3
                break;
718
3
            }
719
4.70k
            if (state->head != Z_NULL)
720
0
                state->head->text = (int)((hold >> 8) & 1);
721
4.70k
            if ((state->flags & 0x0200) && (state->wrap & 4))
722
134
                CRC2(state->check, hold);
723
4.70k
            INITBITS();
724
4.70k
            state->mode = TIME;
725
4.70k
        case TIME:
726
4.70k
            NEEDBITS(32);
727
4.69k
            if (state->head != Z_NULL)
728
0
                state->head->time = hold;
729
4.69k
            if ((state->flags & 0x0200) && (state->wrap & 4))
730
131
                CRC4(state->check, hold);
731
4.69k
            INITBITS();
732
4.69k
            state->mode = OS;
733
4.69k
        case OS:
734
4.69k
            NEEDBITS(16);
735
4.69k
            if (state->head != Z_NULL) {
736
0
                state->head->xflags = (int)(hold & 0xff);
737
0
                state->head->os = (int)(hold >> 8);
738
0
            }
739
4.69k
            if ((state->flags & 0x0200) && (state->wrap & 4))
740
128
                CRC2(state->check, hold);
741
4.69k
            INITBITS();
742
4.69k
            state->mode = EXLEN;
743
4.69k
        case EXLEN:
744
4.69k
            if (state->flags & 0x0400) {
745
99
                NEEDBITS(16);
746
95
                state->length = (unsigned)(hold);
747
95
                if (state->head != Z_NULL)
748
0
                    state->head->extra_len = (unsigned)hold;
749
95
                if ((state->flags & 0x0200) && (state->wrap & 4))
750
60
                    CRC2(state->check, hold);
751
95
                INITBITS();
752
95
            }
753
4.59k
            else if (state->head != Z_NULL)
754
0
                state->head->extra = Z_NULL;
755
4.68k
            state->mode = EXTRA;
756
4.70k
        case EXTRA:
757
4.70k
            if (state->flags & 0x0400) {
758
115
                copy = state->length;
759
115
                if (copy > have) copy = have;
760
115
                if (copy) {
761
80
                    if (state->head != Z_NULL &&
762
0
                        state->head->extra != Z_NULL) {
763
0
                        len = state->head->extra_len - state->length;
764
0
                        zmemcpy(state->head->extra + len, next,
765
0
                                len + copy > state->head->extra_max ?
766
0
                                state->head->extra_max - len : copy);
767
0
                    }
768
80
                    if ((state->flags & 0x0200) && (state->wrap & 4))
769
50
                        state->check = crc32(state->check, next, copy);
770
80
                    have -= copy;
771
80
                    next += copy;
772
80
                    state->length -= copy;
773
80
                }
774
115
                if (state->length) goto inf_leave;
775
115
            }
776
4.64k
            state->length = 0;
777
4.64k
            state->mode = NAME;
778
4.82k
        case NAME:
779
4.82k
            if (state->flags & 0x0800) {
780
1.44k
                if (have == 0) goto inf_leave;
781
1.44k
                copy = 0;
782
4.88M
                do {
783
4.88M
                    len = (unsigned)(next[copy++]);
784
4.88M
                    if (state->head != Z_NULL &&
785
0
                            state->head->name != Z_NULL &&
786
0
                            state->length < state->head->name_max)
787
0
                        state->head->name[state->length++] = (Bytef)len;
788
4.88M
                } while (len && copy < have);
789
1.44k
                if ((state->flags & 0x0200) && (state->wrap & 4))
790
141
                    state->check = crc32(state->check, next, copy);
791
1.44k
                have -= copy;
792
1.44k
                next += copy;
793
1.44k
                if (len) goto inf_leave;
794
1.44k
            }
795
3.37k
            else if (state->head != Z_NULL)
796
0
                state->head->name = Z_NULL;
797
4.59k
            state->length = 0;
798
4.59k
            state->mode = COMMENT;
799
4.80k
        case COMMENT:
800
4.80k
            if (state->flags & 0x1000) {
801
426
                if (have == 0) goto inf_leave;
802
422
                copy = 0;
803
3.37M
                do {
804
3.37M
                    len = (unsigned)(next[copy++]);
805
3.37M
                    if (state->head != Z_NULL &&
806
0
                            state->head->comment != Z_NULL &&
807
0
                            state->length < state->head->comm_max)
808
0
                        state->head->comment[state->length++] = (Bytef)len;
809
3.37M
                } while (len && copy < have);
810
422
                if ((state->flags & 0x0200) && (state->wrap & 4))
811
107
                    state->check = crc32(state->check, next, copy);
812
422
                have -= copy;
813
422
                next += copy;
814
422
                if (len) goto inf_leave;
815
422
            }
816
4.37k
            else if (state->head != Z_NULL)
817
0
                state->head->comment = Z_NULL;
818
4.53k
            state->mode = HCRC;
819
4.53k
        case HCRC:
820
4.53k
            if (state->flags & 0x0200) {
821
50
                NEEDBITS(16);
822
37
                if ((state->wrap & 4) && hold != (state->check & 0xffff)) {
823
35
                    strm->msg = (char *)"header crc mismatch";
824
35
                    state->mode = BAD;
825
35
                    break;
826
35
                }
827
2
                INITBITS();
828
2
            }
829
4.48k
            if (state->head != Z_NULL) {
830
0
                state->head->hcrc = (int)((state->flags >> 9) & 1);
831
0
                state->head->done = 1;
832
0
            }
833
4.48k
            strm->adler = state->check = crc32(0L, Z_NULL, 0);
834
4.48k
            state->mode = TYPE;
835
4.48k
            break;
836
0
#endif
837
693
        case DICTID:
838
693
            NEEDBITS(32);
839
292
            strm->adler = state->check = ZSWAP32(hold);
840
292
            INITBITS();
841
292
            state->mode = DICT;
842
292
        case DICT:
843
292
            if (state->havedict == 0) {
844
292
                RESTORE();
845
292
                return Z_NEED_DICT;
846
292
            }
847
0
            strm->adler = state->check = adler32(0L, Z_NULL, 0);
848
0
            state->mode = TYPE;
849
641k
        case TYPE:
850
641k
            if (flush == Z_BLOCK || flush == Z_TREES) goto inf_leave;
851
1.01M
        case TYPEDO:
852
1.01M
            if (state->last) {
853
356k
                BYTEBITS();
854
356k
                state->mode = CHECK;
855
356k
                break;
856
356k
            }
857
661k
            NEEDBITS(3);
858
659k
            state->last = BITS(1);
859
659k
            DROPBITS(1);
860
659k
            switch (BITS(2)) {
861
59.5k
            case 0:                             /* stored block */
862
59.5k
                Tracev((stderr, "inflate:     stored block%s\n",
863
59.5k
                        state->last ? " (last)" : ""));
864
59.5k
                state->mode = STORED;
865
59.5k
                break;
866
431k
            case 1:                             /* fixed block */
867
431k
                fixedtables(state);
868
431k
                Tracev((stderr, "inflate:     fixed codes block%s\n",
869
431k
                        state->last ? " (last)" : ""));
870
431k
                state->mode = LEN_;             /* decode codes */
871
431k
                if (flush == Z_TREES) {
872
0
                    DROPBITS(2);
873
0
                    goto inf_leave;
874
0
                }
875
431k
                break;
876
431k
            case 2:                             /* dynamic block */
877
166k
                Tracev((stderr, "inflate:     dynamic codes block%s\n",
878
166k
                        state->last ? " (last)" : ""));
879
166k
                state->mode = TABLE;
880
166k
                break;
881
2.55k
            case 3:
882
2.55k
                strm->msg = (char *)"invalid block type";
883
2.55k
                state->mode = BAD;
884
659k
            }
885
659k
            DROPBITS(2);
886
659k
            break;
887
60.6k
        case STORED:
888
60.6k
            BYTEBITS();                         /* go to byte boundary */
889
60.6k
            NEEDBITS(32);
890
57.1k
            if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) {
891
7.79k
                strm->msg = (char *)"invalid stored block lengths";
892
7.79k
                state->mode = BAD;
893
7.79k
                break;
894
7.79k
            }
895
49.3k
            state->length = (unsigned)hold & 0xffff;
896
49.3k
            Tracev((stderr, "inflate:       stored length %u\n",
897
49.3k
                    state->length));
898
49.3k
            INITBITS();
899
49.3k
            state->mode = COPY_;
900
49.3k
            if (flush == Z_TREES) goto inf_leave;
901
49.3k
        case COPY_:
902
49.3k
            state->mode = COPY;
903
61.5k
        case COPY:
904
61.5k
            copy = state->length;
905
61.5k
            if (copy) {
906
15.6k
                if (copy > have) copy = have;
907
15.6k
                if (copy > left) copy = left;
908
15.6k
                if (copy == 0) goto inf_leave;
909
8.89k
                zmemcpy(put, next, copy);
910
8.89k
                have -= copy;
911
8.89k
                next += copy;
912
8.89k
                left -= copy;
913
8.89k
                put += copy;
914
8.89k
                state->length -= copy;
915
8.89k
                break;
916
15.6k
            }
917
45.9k
            Tracev((stderr, "inflate:       stored end\n"));
918
45.9k
            state->mode = TYPE;
919
45.9k
            break;
920
167k
        case TABLE:
921
167k
            NEEDBITS(14);
922
165k
            state->nlen = BITS(5) + 257;
923
165k
            DROPBITS(5);
924
165k
            state->ndist = BITS(5) + 1;
925
165k
            DROPBITS(5);
926
165k
            state->ncode = BITS(4) + 4;
927
165k
            DROPBITS(4);
928
165k
#ifndef PKZIP_BUG_WORKAROUND
929
165k
            if (state->nlen > 286 || state->ndist > 30) {
930
2.56k
                strm->msg = (char *)"too many length or distance symbols";
931
2.56k
                state->mode = BAD;
932
2.56k
                break;
933
2.56k
            }
934
162k
#endif
935
162k
            Tracev((stderr, "inflate:       table sizes ok\n"));
936
162k
            state->have = 0;
937
162k
            state->mode = LENLENS;
938
164k
        case LENLENS:
939
2.61M
            while (state->have < state->ncode) {
940
2.45M
                NEEDBITS(3);
941
2.45M
                state->lens[order[state->have++]] = (unsigned short)BITS(3);
942
2.45M
                DROPBITS(3);
943
2.45M
            }
944
767k
            while (state->have < 19)
945
607k
                state->lens[order[state->have++]] = 0;
946
160k
            state->next = state->codes;
947
160k
            state->lencode = (const code FAR *)(state->next);
948
160k
            state->lenbits = 7;
949
160k
            ret = inflate_table(CODES, state->lens, 19, &(state->next),
950
160k
                                &(state->lenbits), state->work);
951
160k
            if (ret) {
952
21.1k
                strm->msg = (char *)"invalid code lengths set";
953
21.1k
                state->mode = BAD;
954
21.1k
                break;
955
21.1k
            }
956
139k
            Tracev((stderr, "inflate:       code lengths ok\n"));
957
139k
            state->have = 0;
958
139k
            state->mode = CODELENS;
959
143k
        case CODELENS:
960
11.6M
            while (state->have < state->nlen + state->ndist) {
961
15.1M
                for (;;) {
962
15.1M
                    here = state->lencode[BITS(state->lenbits)];
963
15.1M
                    if ((unsigned)(here.bits) <= bits) break;
964
3.62M
                    PULLBYTE();
965
3.62M
                }
966
11.5M
                if (here.val < 16) {
967
10.1M
                    DROPBITS(here.bits);
968
10.1M
                    state->lens[state->have++] = here.val;
969
10.1M
                }
970
1.32M
                else {
971
1.32M
                    if (here.val == 16) {
972
392k
                        NEEDBITS(here.bits + 2);
973
390k
                        DROPBITS(here.bits);
974
390k
                        if (state->have == 0) {
975
1.30k
                            strm->msg = (char *)"invalid bit length repeat";
976
1.30k
                            state->mode = BAD;
977
1.30k
                            break;
978
1.30k
                        }
979
389k
                        len = state->lens[state->have - 1];
980
389k
                        copy = 3 + BITS(2);
981
389k
                        DROPBITS(2);
982
389k
                    }
983
932k
                    else if (here.val == 17) {
984
485k
                        NEEDBITS(here.bits + 3);
985
483k
                        DROPBITS(here.bits);
986
483k
                        len = 0;
987
483k
                        copy = 3 + BITS(3);
988
483k
                        DROPBITS(3);
989
483k
                    }
990
447k
                    else {
991
447k
                        NEEDBITS(here.bits + 7);
992
445k
                        DROPBITS(here.bits);
993
445k
                        len = 0;
994
445k
                        copy = 11 + BITS(7);
995
445k
                        DROPBITS(7);
996
445k
                    }
997
1.31M
                    if (state->have + copy > state->nlen + state->ndist) {
998
5.24k
                        strm->msg = (char *)"invalid bit length repeat";
999
5.24k
                        state->mode = BAD;
1000
5.24k
                        break;
1001
5.24k
                    }
1002
30.8M
                    while (copy--)
1003
29.5M
                        state->lens[state->have++] = (unsigned short)len;
1004
1.31M
                }
1005
11.5M
            }
1006
1007
            /* handle error breaks in while */
1008
131k
            if (state->mode == BAD) break;
1009
1010
            /* check for end-of-block code (better have one) */
1011
125k
            if (state->lens[256] == 0) {
1012
5.20k
                strm->msg = (char *)"invalid code -- missing end-of-block";
1013
5.20k
                state->mode = BAD;
1014
5.20k
                break;
1015
5.20k
            }
1016
1017
            /* build code tables -- note: do not change the lenbits or distbits
1018
               values here (9 and 6) without reading the comments in inftrees.h
1019
               concerning the ENOUGH constants, which depend on those values */
1020
120k
            state->next = state->codes;
1021
120k
            state->lencode = (const code FAR *)(state->next);
1022
120k
            state->lenbits = 9;
1023
120k
            ret = inflate_table(LENS, state->lens, state->nlen, &(state->next),
1024
120k
                                &(state->lenbits), state->work);
1025
120k
            if (ret) {
1026
3.94k
                strm->msg = (char *)"invalid literal/lengths set";
1027
3.94k
                state->mode = BAD;
1028
3.94k
                break;
1029
3.94k
            }
1030
116k
            state->distcode = (const code FAR *)(state->next);
1031
116k
            state->distbits = 6;
1032
116k
            ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist,
1033
116k
                            &(state->next), &(state->distbits), state->work);
1034
116k
            if (ret) {
1035
4.06k
                strm->msg = (char *)"invalid distances set";
1036
4.06k
                state->mode = BAD;
1037
4.06k
                break;
1038
4.06k
            }
1039
112k
            Tracev((stderr, "inflate:       codes ok\n"));
1040
112k
            state->mode = LEN_;
1041
112k
            if (flush == Z_TREES) goto inf_leave;
1042
543k
        case LEN_:
1043
543k
            state->mode = LEN;
1044
5.36M
        case LEN:
1045
5.36M
            if (have >= 6 && left >= 258) {
1046
1.59M
                RESTORE();
1047
1.59M
                inflate_fast(strm, out);
1048
1.59M
                LOAD();
1049
1.59M
                if (state->mode == TYPE)
1050
403k
                    state->back = -1;
1051
1.59M
                break;
1052
1.59M
            }
1053
3.77M
            state->back = 0;
1054
6.05M
            for (;;) {
1055
6.05M
                here = state->lencode[BITS(state->lenbits)];
1056
6.05M
                if ((unsigned)(here.bits) <= bits) break;
1057
2.30M
                PULLBYTE();
1058
2.30M
            }
1059
3.74M
            if (here.op && (here.op & 0xf0) == 0) {
1060
76.5k
                last = here;
1061
107k
                for (;;) {
1062
107k
                    here = state->lencode[last.val +
1063
107k
                            (BITS(last.bits + last.op) >> last.bits)];
1064
107k
                    if ((unsigned)(last.bits + here.bits) <= bits) break;
1065
31.5k
                    PULLBYTE();
1066
31.5k
                }
1067
75.8k
                DROPBITS(last.bits);
1068
75.8k
                state->back += last.bits;
1069
75.8k
            }
1070
3.74M
            DROPBITS(here.bits);
1071
3.74M
            state->back += here.bits;
1072
3.74M
            state->length = (unsigned)here.val;
1073
3.74M
            if ((int)(here.op) == 0) {
1074
1.79M
                Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?
1075
1.79M
                        "inflate:         literal '%c'\n" :
1076
1.79M
                        "inflate:         literal 0x%02x\n", here.val));
1077
1.79M
                state->mode = LIT;
1078
1.79M
                break;
1079
1.79M
            }
1080
1.95M
            if (here.op & 32) {
1081
95.3k
                Tracevv((stderr, "inflate:         end of block\n"));
1082
95.3k
                state->back = -1;
1083
95.3k
                state->mode = TYPE;
1084
95.3k
                break;
1085
95.3k
            }
1086
1.86M
            if (here.op & 64) {
1087
938
                strm->msg = (char *)"invalid literal/length code";
1088
938
                state->mode = BAD;
1089
938
                break;
1090
938
            }
1091
1.85M
            state->extra = (unsigned)(here.op) & 15;
1092
1.85M
            state->mode = LENEXT;
1093
1.86M
        case LENEXT:
1094
1.86M
            if (state->extra) {
1095
412k
                NEEDBITS(state->extra);
1096
408k
                state->length += BITS(state->extra);
1097
408k
                DROPBITS(state->extra);
1098
408k
                state->back += state->extra;
1099
408k
            }
1100
1.85M
            Tracevv((stderr, "inflate:         length %u\n", state->length));
1101
1.85M
            state->was = state->length;
1102
1.85M
            state->mode = DIST;
1103
1.86M
        case DIST:
1104
2.41M
            for (;;) {
1105
2.41M
                here = state->distcode[BITS(state->distbits)];
1106
2.41M
                if ((unsigned)(here.bits) <= bits) break;
1107
566k
                PULLBYTE();
1108
566k
            }
1109
1.85M
            if ((here.op & 0xf0) == 0) {
1110
52.0k
                last = here;
1111
70.0k
                for (;;) {
1112
70.0k
                    here = state->distcode[last.val +
1113
70.0k
                            (BITS(last.bits + last.op) >> last.bits)];
1114
70.0k
                    if ((unsigned)(last.bits + here.bits) <= bits) break;
1115
19.8k
                    PULLBYTE();
1116
19.8k
                }
1117
50.2k
                DROPBITS(last.bits);
1118
50.2k
                state->back += last.bits;
1119
50.2k
            }
1120
1.85M
            DROPBITS(here.bits);
1121
1.85M
            state->back += here.bits;
1122
1.85M
            if (here.op & 64) {
1123
1.34k
                strm->msg = (char *)"invalid distance code";
1124
1.34k
                state->mode = BAD;
1125
1.34k
                break;
1126
1.34k
            }
1127
1.84M
            state->offset = (unsigned)here.val;
1128
1.84M
            state->extra = (unsigned)(here.op) & 15;
1129
1.84M
            state->mode = DISTEXT;
1130
1.85M
        case DISTEXT:
1131
1.85M
            if (state->extra) {
1132
844k
                NEEDBITS(state->extra);
1133
836k
                state->offset += BITS(state->extra);
1134
836k
                DROPBITS(state->extra);
1135
836k
                state->back += state->extra;
1136
836k
            }
1137
#ifdef INFLATE_STRICT
1138
            if (state->offset > state->dmax) {
1139
                strm->msg = (char *)"invalid distance too far back";
1140
                state->mode = BAD;
1141
                break;
1142
            }
1143
#endif
1144
1.84M
            Tracevv((stderr, "inflate:         distance %u\n", state->offset));
1145
1.84M
            state->mode = MATCH;
1146
5.22M
        case MATCH:
1147
5.22M
            if (left == 0) goto inf_leave;
1148
4.03M
            copy = out - left;
1149
4.03M
            if (state->offset > copy) {         /* copy from window */
1150
1.26M
                copy = state->offset - copy;
1151
1.26M
                if (copy > state->whave) {
1152
2.18k
                    if (state->sane) {
1153
2.18k
                        strm->msg = (char *)"invalid distance too far back";
1154
2.18k
                        state->mode = BAD;
1155
2.18k
                        break;
1156
2.18k
                    }
1157
#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR
1158
                    Trace((stderr, "inflate.c too far\n"));
1159
                    copy -= state->whave;
1160
                    if (copy > state->length) copy = state->length;
1161
                    if (copy > left) copy = left;
1162
                    left -= copy;
1163
                    state->length -= copy;
1164
                    do {
1165
                        *put++ = 0;
1166
                    } while (--copy);
1167
                    if (state->length == 0) state->mode = LEN;
1168
                    break;
1169
#endif
1170
2.18k
                }
1171
1.25M
                if (copy > state->wnext) {
1172
175k
                    copy -= state->wnext;
1173
175k
                    from = state->window + (state->wsize - copy);
1174
175k
                }
1175
1.08M
                else
1176
1.08M
                    from = state->window + (state->wnext - copy);
1177
1.25M
                if (copy > state->length) copy = state->length;
1178
1.25M
            }
1179
2.77M
            else {                              /* copy from output */
1180
2.77M
                from = put - state->offset;
1181
2.77M
                copy = state->length;
1182
2.77M
            }
1183
4.03M
            if (copy > left) copy = left;
1184
4.03M
            left -= copy;
1185
4.03M
            state->length -= copy;
1186
305M
            do {
1187
305M
                *put++ = *from++;
1188
305M
            } while (--copy);
1189
4.03M
            if (state->length == 0) state->mode = LEN;
1190
4.03M
            break;
1191
1.80M
        case LIT:
1192
1.80M
            if (left == 0) goto inf_leave;
1193
1.79M
            *put++ = (unsigned char)(state->length);
1194
1.79M
            left--;
1195
1.79M
            state->mode = LEN;
1196
1.79M
            break;
1197
359k
        case CHECK:
1198
359k
            if (state->wrap) {
1199
48.7k
                NEEDBITS(32);
1200
41.7k
                out -= left;
1201
41.7k
                strm->total_out += out;
1202
41.7k
                state->total += out;
1203
41.7k
                if ((state->wrap & 4) && out)
1204
39.7k
                    strm->adler = state->check =
1205
39.7k
                        UPDATE(state->check, put - out, out);
1206
41.7k
                out = left;
1207
41.7k
                if ((state->wrap & 4) && (
1208
41.7k
#ifdef GUNZIP
1209
41.7k
                     state->flags ? hold :
1210
41.7k
#endif
1211
41.7k
                     ZSWAP32(hold)) != state->check) {
1212
4.06k
                    strm->msg = (char *)"incorrect data check";
1213
4.06k
                    state->mode = BAD;
1214
4.06k
                    break;
1215
4.06k
                }
1216
37.6k
                INITBITS();
1217
37.6k
                Tracev((stderr, "inflate:   check matches trailer\n"));
1218
37.6k
            }
1219
348k
#ifdef GUNZIP
1220
348k
            state->mode = LENGTH;
1221
348k
        case LENGTH:
1222
348k
            if (state->wrap && state->flags) {
1223
78
                NEEDBITS(32);
1224
70
                if (hold != (state->total & 0xffffffffUL)) {
1225
64
                    strm->msg = (char *)"incorrect length check";
1226
64
                    state->mode = BAD;
1227
64
                    break;
1228
64
                }
1229
6
                INITBITS();
1230
6
                Tracev((stderr, "inflate:   length matches trailer\n"));
1231
6
            }
1232
348k
#endif
1233
348k
            state->mode = DONE;
1234
348k
        case DONE:
1235
348k
            ret = Z_STREAM_END;
1236
348k
            goto inf_leave;
1237
112k
        case BAD:
1238
112k
            ret = Z_DATA_ERROR;
1239
112k
            goto inf_leave;
1240
0
        case MEM:
1241
0
            return Z_MEM_ERROR;
1242
0
        case SYNC:
1243
0
        default:
1244
0
            return Z_STREAM_ERROR;
1245
12.6M
        }
1246
1247
    /*
1248
       Return from inflate(), updating the total counts and the check value.
1249
       If there was no progress during the inflate() call, return a buffer
1250
       error.  Call updatewindow() to create and/or update the window state.
1251
       Note: a memory error from inflate() is non-recoverable.
1252
     */
1253
1.74M
  inf_leave:
1254
1.74M
    RESTORE();
1255
1.74M
    if (state->wsize || (out != strm->avail_out && state->mode < BAD &&
1256
354k
            (state->mode < CHECK || flush != Z_FINISH)))
1257
1.57M
        if (updatewindow(strm, strm->next_out, out - strm->avail_out)) {
1258
0
            state->mode = MEM;
1259
0
            return Z_MEM_ERROR;
1260
0
        }
1261
1.74M
    in -= strm->avail_in;
1262
1.74M
    out -= strm->avail_out;
1263
1.74M
    strm->total_in += in;
1264
1.74M
    strm->total_out += out;
1265
1.74M
    state->total += out;
1266
1.74M
    if ((state->wrap & 4) && out)
1267
627k
        strm->adler = state->check =
1268
627k
            UPDATE(state->check, strm->next_out - out, out);
1269
1.74M
    strm->data_type = (int)state->bits + (state->last ? 64 : 0) +
1270
1.74M
                      (state->mode == TYPE ? 128 : 0) +
1271
1.74M
                      (state->mode == LEN_ || state->mode == COPY_ ? 256 : 0);
1272
1.74M
    if (((in == 0 && out == 0) || flush == Z_FINISH) && ret == Z_OK)
1273
42.7k
        ret = Z_BUF_ERROR;
1274
1.74M
    return ret;
1275
1.74M
}
1276
1277
int ZEXPORT inflateEnd(strm)
1278
z_streamp strm;
1279
518k
{
1280
518k
    struct inflate_state FAR *state;
1281
518k
    if (inflateStateCheck(strm))
1282
0
        return Z_STREAM_ERROR;
1283
518k
    state = (struct inflate_state FAR *)strm->state;
1284
518k
    if (state->window != Z_NULL) ZFREE(strm, state->window);
1285
518k
    ZFREE(strm, strm->state);
1286
518k
    strm->state = Z_NULL;
1287
518k
    Tracev((stderr, "inflate: end\n"));
1288
518k
    return Z_OK;
1289
518k
}
1290
1291
int ZEXPORT inflateGetDictionary(strm, dictionary, dictLength)
1292
z_streamp strm;
1293
Bytef *dictionary;
1294
uInt *dictLength;
1295
0
{
1296
0
    struct inflate_state FAR *state;
1297
1298
    /* check state */
1299
0
    if (inflateStateCheck(strm)) return Z_STREAM_ERROR;
1300
0
    state = (struct inflate_state FAR *)strm->state;
1301
1302
    /* copy dictionary */
1303
0
    if (state->whave && dictionary != Z_NULL) {
1304
0
        zmemcpy(dictionary, state->window + state->wnext,
1305
0
                state->whave - state->wnext);
1306
0
        zmemcpy(dictionary + state->whave - state->wnext,
1307
0
                state->window, state->wnext);
1308
0
    }
1309
0
    if (dictLength != Z_NULL)
1310
0
        *dictLength = state->whave;
1311
0
    return Z_OK;
1312
0
}
1313
1314
int ZEXPORT inflateSetDictionary(strm, dictionary, dictLength)
1315
z_streamp strm;
1316
const Bytef *dictionary;
1317
uInt dictLength;
1318
0
{
1319
0
    struct inflate_state FAR *state;
1320
0
    unsigned long dictid;
1321
0
    int ret;
1322
1323
    /* check state */
1324
0
    if (inflateStateCheck(strm)) return Z_STREAM_ERROR;
1325
0
    state = (struct inflate_state FAR *)strm->state;
1326
0
    if (state->wrap != 0 && state->mode != DICT)
1327
0
        return Z_STREAM_ERROR;
1328
1329
    /* check for correct dictionary identifier */
1330
0
    if (state->mode == DICT) {
1331
0
        dictid = adler32(0L, Z_NULL, 0);
1332
0
        dictid = adler32(dictid, dictionary, dictLength);
1333
0
        if (dictid != state->check)
1334
0
            return Z_DATA_ERROR;
1335
0
    }
1336
1337
    /* copy dictionary to window using updatewindow(), which will amend the
1338
       existing dictionary if appropriate */
1339
0
    ret = updatewindow(strm, dictionary + dictLength, dictLength);
1340
0
    if (ret) {
1341
0
        state->mode = MEM;
1342
0
        return Z_MEM_ERROR;
1343
0
    }
1344
0
    state->havedict = 1;
1345
0
    Tracev((stderr, "inflate:   dictionary set\n"));
1346
0
    return Z_OK;
1347
0
}
1348
1349
int ZEXPORT inflateGetHeader(strm, head)
1350
z_streamp strm;
1351
gz_headerp head;
1352
0
{
1353
0
    struct inflate_state FAR *state;
1354
1355
    /* check state */
1356
0
    if (inflateStateCheck(strm)) return Z_STREAM_ERROR;
1357
0
    state = (struct inflate_state FAR *)strm->state;
1358
0
    if ((state->wrap & 2) == 0) return Z_STREAM_ERROR;
1359
1360
    /* save header structure */
1361
0
    state->head = head;
1362
0
    head->done = 0;
1363
0
    return Z_OK;
1364
0
}
1365
1366
/*
1367
   Search buf[0..len-1] for the pattern: 0, 0, 0xff, 0xff.  Return when found
1368
   or when out of input.  When called, *have is the number of pattern bytes
1369
   found in order so far, in 0..3.  On return *have is updated to the new
1370
   state.  If on return *have equals four, then the pattern was found and the
1371
   return value is how many bytes were read including the last byte of the
1372
   pattern.  If *have is less than four, then the pattern has not been found
1373
   yet and the return value is len.  In the latter case, syncsearch() can be
1374
   called again with more data and the *have state.  *have is initialized to
1375
   zero for the first call.
1376
 */
1377
local unsigned syncsearch(have, buf, len)
1378
unsigned FAR *have;
1379
const unsigned char FAR *buf;
1380
unsigned len;
1381
0
{
1382
0
    unsigned got;
1383
0
    unsigned next;
1384
1385
0
    got = *have;
1386
0
    next = 0;
1387
0
    while (next < len && got < 4) {
1388
0
        if ((int)(buf[next]) == (got < 2 ? 0 : 0xff))
1389
0
            got++;
1390
0
        else if (buf[next])
1391
0
            got = 0;
1392
0
        else
1393
0
            got = 4 - got;
1394
0
        next++;
1395
0
    }
1396
0
    *have = got;
1397
0
    return next;
1398
0
}
1399
1400
int ZEXPORT inflateSync(strm)
1401
z_streamp strm;
1402
0
{
1403
0
    unsigned len;               /* number of bytes to look at or looked at */
1404
0
    unsigned long in, out;      /* temporary to save total_in and total_out */
1405
0
    unsigned char buf[4];       /* to restore bit buffer to byte string */
1406
0
    struct inflate_state FAR *state;
1407
1408
    /* check parameters */
1409
0
    if (inflateStateCheck(strm)) return Z_STREAM_ERROR;
1410
0
    state = (struct inflate_state FAR *)strm->state;
1411
0
    if (strm->avail_in == 0 && state->bits < 8) return Z_BUF_ERROR;
1412
1413
    /* if first time, start search in bit buffer */
1414
0
    if (state->mode != SYNC) {
1415
0
        state->mode = SYNC;
1416
0
        state->hold <<= state->bits & 7;
1417
0
        state->bits -= state->bits & 7;
1418
0
        len = 0;
1419
0
        while (state->bits >= 8) {
1420
0
            buf[len++] = (unsigned char)(state->hold);
1421
0
            state->hold >>= 8;
1422
0
            state->bits -= 8;
1423
0
        }
1424
0
        state->have = 0;
1425
0
        syncsearch(&(state->have), buf, len);
1426
0
    }
1427
1428
    /* search available input */
1429
0
    len = syncsearch(&(state->have), strm->next_in, strm->avail_in);
1430
0
    strm->avail_in -= len;
1431
0
    strm->next_in += len;
1432
0
    strm->total_in += len;
1433
1434
    /* return no joy or set up to restart inflate() on a new block */
1435
0
    if (state->have != 4) return Z_DATA_ERROR;
1436
0
    in = strm->total_in;  out = strm->total_out;
1437
0
    inflateReset(strm);
1438
0
    strm->total_in = in;  strm->total_out = out;
1439
0
    state->mode = TYPE;
1440
0
    return Z_OK;
1441
0
}
1442
1443
/*
1444
   Returns true if inflate is currently at the end of a block generated by
1445
   Z_SYNC_FLUSH or Z_FULL_FLUSH. This function is used by one PPP
1446
   implementation to provide an additional safety check. PPP uses
1447
   Z_SYNC_FLUSH but removes the length bytes of the resulting empty stored
1448
   block. When decompressing, PPP checks that at the end of input packet,
1449
   inflate is waiting for these length bytes.
1450
 */
1451
int ZEXPORT inflateSyncPoint(strm)
1452
z_streamp strm;
1453
0
{
1454
0
    struct inflate_state FAR *state;
1455
1456
0
    if (inflateStateCheck(strm)) return Z_STREAM_ERROR;
1457
0
    state = (struct inflate_state FAR *)strm->state;
1458
0
    return state->mode == STORED && state->bits == 0;
1459
0
}
1460
1461
int ZEXPORT inflateCopy(dest, source)
1462
z_streamp dest;
1463
z_streamp source;
1464
0
{
1465
0
    struct inflate_state FAR *state;
1466
0
    struct inflate_state FAR *copy;
1467
0
    unsigned char FAR *window;
1468
0
    unsigned wsize;
1469
1470
    /* check input */
1471
0
    if (inflateStateCheck(source) || dest == Z_NULL)
1472
0
        return Z_STREAM_ERROR;
1473
0
    state = (struct inflate_state FAR *)source->state;
1474
1475
    /* allocate space */
1476
0
    copy = (struct inflate_state FAR *)
1477
0
           ZALLOC(source, 1, sizeof(struct inflate_state));
1478
0
    if (copy == Z_NULL) return Z_MEM_ERROR;
1479
0
    window = Z_NULL;
1480
0
    if (state->window != Z_NULL) {
1481
0
        window = (unsigned char FAR *)
1482
0
                 ZALLOC(source, 1U << state->wbits, sizeof(unsigned char));
1483
0
        if (window == Z_NULL) {
1484
0
            ZFREE(source, copy);
1485
0
            return Z_MEM_ERROR;
1486
0
        }
1487
0
    }
1488
1489
    /* copy state */
1490
0
    zmemcpy((voidpf)dest, (voidpf)source, sizeof(z_stream));
1491
0
    zmemcpy((voidpf)copy, (voidpf)state, sizeof(struct inflate_state));
1492
0
    copy->strm = dest;
1493
0
    if (state->lencode >= state->codes &&
1494
0
        state->lencode <= state->codes + ENOUGH - 1) {
1495
0
        copy->lencode = copy->codes + (state->lencode - state->codes);
1496
0
        copy->distcode = copy->codes + (state->distcode - state->codes);
1497
0
    }
1498
0
    copy->next = copy->codes + (state->next - state->codes);
1499
0
    if (window != Z_NULL) {
1500
0
        wsize = 1U << state->wbits;
1501
0
        zmemcpy(window, state->window, wsize);
1502
0
    }
1503
0
    copy->window = window;
1504
0
    dest->state = (struct internal_state FAR *)copy;
1505
0
    return Z_OK;
1506
0
}
1507
1508
int ZEXPORT inflateUndermine(strm, subvert)
1509
z_streamp strm;
1510
int subvert;
1511
0
{
1512
0
    struct inflate_state FAR *state;
1513
1514
0
    if (inflateStateCheck(strm)) return Z_STREAM_ERROR;
1515
0
    state = (struct inflate_state FAR *)strm->state;
1516
#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR
1517
    state->sane = !subvert;
1518
    return Z_OK;
1519
#else
1520
0
    (void)subvert;
1521
0
    state->sane = 1;
1522
0
    return Z_DATA_ERROR;
1523
0
#endif
1524
0
}
1525
1526
int ZEXPORT inflateValidate(strm, check)
1527
z_streamp strm;
1528
int check;
1529
0
{
1530
0
    struct inflate_state FAR *state;
1531
1532
0
    if (inflateStateCheck(strm)) return Z_STREAM_ERROR;
1533
0
    state = (struct inflate_state FAR *)strm->state;
1534
0
    if (check)
1535
0
        state->wrap |= 4;
1536
0
    else
1537
0
        state->wrap &= ~4;
1538
0
    return Z_OK;
1539
0
}
1540
1541
long ZEXPORT inflateMark(strm)
1542
z_streamp strm;
1543
0
{
1544
0
    struct inflate_state FAR *state;
1545
1546
0
    if (inflateStateCheck(strm))
1547
0
        return -(1L << 16);
1548
0
    state = (struct inflate_state FAR *)strm->state;
1549
0
    return (long)(((unsigned long)((long)state->back)) << 16) +
1550
0
        (state->mode == COPY ? state->length :
1551
0
            (state->mode == MATCH ? state->was - state->length : 0));
1552
0
}
1553
1554
unsigned long ZEXPORT inflateCodesUsed(strm)
1555
z_streamp strm;
1556
0
{
1557
0
    struct inflate_state FAR *state;
1558
0
    if (inflateStateCheck(strm)) return (unsigned long)-1;
1559
0
    state = (struct inflate_state FAR *)strm->state;
1560
0
    return (unsigned long)(state->next - state->codes);
1561
0
}