Coverage Report

Created: 2026-05-16 06:38

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
4.00M
{
108
4.00M
    struct inflate_state FAR *state;
109
4.00M
    if (strm == Z_NULL ||
110
4.00M
        strm->zalloc == (alloc_func)0 || strm->zfree == (free_func)0)
111
0
        return 1;
112
4.00M
    state = (struct inflate_state FAR *)strm->state;
113
4.00M
    if (state == Z_NULL || state->strm != strm ||
114
4.00M
        state->mode < HEAD || state->mode > SYNC)
115
0
        return 1;
116
4.00M
    return 0;
117
4.00M
}
118
119
int ZEXPORT inflateResetKeep(strm)
120
z_streamp strm;
121
547k
{
122
547k
    struct inflate_state FAR *state;
123
124
547k
    if (inflateStateCheck(strm)) return Z_STREAM_ERROR;
125
547k
    state = (struct inflate_state FAR *)strm->state;
126
547k
    strm->total_in = strm->total_out = state->total = 0;
127
547k
    strm->msg = Z_NULL;
128
547k
    if (state->wrap)        /* to support ill-conceived Java test suite */
129
159k
        strm->adler = state->wrap & 1;
130
547k
    state->mode = HEAD;
131
547k
    state->last = 0;
132
547k
    state->havedict = 0;
133
547k
    state->dmax = 32768U;
134
547k
    state->head = Z_NULL;
135
547k
    state->hold = 0;
136
547k
    state->bits = 0;
137
547k
    state->lencode = state->distcode = state->next = state->codes;
138
547k
    state->sane = 1;
139
547k
    state->back = -1;
140
547k
    Tracev((stderr, "inflate: reset\n"));
141
547k
    return Z_OK;
142
547k
}
143
144
int ZEXPORT inflateReset(strm)
145
z_streamp strm;
146
547k
{
147
547k
    struct inflate_state FAR *state;
148
149
547k
    if (inflateStateCheck(strm)) return Z_STREAM_ERROR;
150
547k
    state = (struct inflate_state FAR *)strm->state;
151
547k
    state->wsize = 0;
152
547k
    state->whave = 0;
153
547k
    state->wnext = 0;
154
547k
    return inflateResetKeep(strm);
155
547k
}
156
157
int ZEXPORT inflateReset2(strm, windowBits)
158
z_streamp strm;
159
int windowBits;
160
547k
{
161
547k
    int wrap;
162
547k
    struct inflate_state FAR *state;
163
164
    /* get the state */
165
547k
    if (inflateStateCheck(strm)) return Z_STREAM_ERROR;
166
547k
    state = (struct inflate_state FAR *)strm->state;
167
168
    /* extract wrap request from windowBits parameter */
169
547k
    if (windowBits < 0) {
170
387k
        wrap = 0;
171
387k
        windowBits = -windowBits;
172
387k
    }
173
159k
    else {
174
159k
        wrap = (windowBits >> 4) + 5;
175
159k
#ifdef GUNZIP
176
159k
        if (windowBits < 48)
177
159k
            windowBits &= 15;
178
159k
#endif
179
159k
    }
180
181
    /* set number of window bits, free window if different */
182
547k
    if (windowBits && (windowBits < 8 || windowBits > 15))
183
0
        return Z_STREAM_ERROR;
184
547k
    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
547k
    state->wrap = wrap;
191
547k
    state->wbits = (unsigned)windowBits;
192
547k
    return inflateReset(strm);
193
547k
}
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
547k
{
201
547k
    int ret;
202
547k
    struct inflate_state FAR *state;
203
204
547k
    if (version == Z_NULL || version[0] != ZLIB_VERSION[0] ||
205
547k
        stream_size != (int)(sizeof(z_stream)))
206
0
        return Z_VERSION_ERROR;
207
547k
    if (strm == Z_NULL) return Z_STREAM_ERROR;
208
547k
    strm->msg = Z_NULL;                 /* in case we return an error */
209
547k
    if (strm->zalloc == (alloc_func)0) {
210
#ifdef Z_SOLO
211
        return Z_STREAM_ERROR;
212
#else
213
547k
        strm->zalloc = zcalloc;
214
547k
        strm->opaque = (voidpf)0;
215
547k
#endif
216
547k
    }
217
547k
    if (strm->zfree == (free_func)0)
218
#ifdef Z_SOLO
219
        return Z_STREAM_ERROR;
220
#else
221
547k
        strm->zfree = zcfree;
222
547k
#endif
223
547k
    state = (struct inflate_state FAR *)
224
547k
            ZALLOC(strm, 1, sizeof(struct inflate_state));
225
547k
    if (state == Z_NULL) return Z_MEM_ERROR;
226
547k
    Tracev((stderr, "inflate: allocated\n"));
227
547k
    strm->state = (struct internal_state FAR *)state;
228
547k
    state->strm = strm;
229
547k
    state->window = Z_NULL;
230
547k
    state->mode = HEAD;     /* to pass state test in inflateReset2() */
231
547k
    ret = inflateReset2(strm, windowBits);
232
547k
    if (ret != Z_OK) {
233
0
        ZFREE(strm, state);
234
0
        strm->state = Z_NULL;
235
0
    }
236
547k
    return ret;
237
547k
}
238
239
int ZEXPORT inflateInit_(strm, version, stream_size)
240
z_streamp strm;
241
const char *version;
242
int stream_size;
243
37.9k
{
244
37.9k
    return inflateInit2_(strm, DEF_WBITS, version, stream_size);
245
37.9k
}
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
449k
{
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
449k
#   include "inffixed.h"
314
449k
#endif /* BUILDFIXED */
315
449k
    state->lencode = lenfix;
316
449k
    state->lenbits = 9;
317
449k
    state->distcode = distfix;
318
449k
    state->distbits = 5;
319
449k
}
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.63M
{
401
1.63M
    struct inflate_state FAR *state;
402
1.63M
    unsigned dist;
403
404
1.63M
    state = (struct inflate_state FAR *)strm->state;
405
406
    /* if it hasn't been done already, allocate space for the window */
407
1.63M
    if (state->window == Z_NULL) {
408
366k
        state->window = (unsigned char FAR *)
409
366k
                        ZALLOC(strm, 1U << state->wbits,
410
366k
                               sizeof(unsigned char));
411
366k
        if (state->window == Z_NULL) return 1;
412
366k
    }
413
414
    /* if window not in use yet, initialize */
415
1.63M
    if (state->wsize == 0) {
416
366k
        state->wsize = 1U << state->wbits;
417
366k
        state->wnext = 0;
418
366k
        state->whave = 0;
419
366k
    }
420
421
    /* copy state->wsize or less output bytes into the circular window */
422
1.63M
    if (copy >= state->wsize) {
423
113k
        zmemcpy(state->window, end - state->wsize, state->wsize);
424
113k
        state->wnext = 0;
425
113k
        state->whave = state->wsize;
426
113k
    }
427
1.51M
    else {
428
1.51M
        dist = state->wsize - state->wnext;
429
1.51M
        if (dist > copy) dist = copy;
430
1.51M
        zmemcpy(state->window + state->wnext, end - copy, dist);
431
1.51M
        copy -= dist;
432
1.51M
        if (copy) {
433
160k
            zmemcpy(state->window, end - copy, copy);
434
160k
            state->wnext = copy;
435
160k
            state->whave = state->wsize;
436
160k
        }
437
1.35M
        else {
438
1.35M
            state->wnext += dist;
439
1.35M
            if (state->wnext == state->wsize) state->wnext = 0;
440
1.35M
            if (state->whave < state->wsize) state->whave += dist;
441
1.35M
        }
442
1.51M
    }
443
1.63M
    return 0;
444
1.63M
}
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
703k
    (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.07k
    do { \
460
5.07k
        hbuf[0] = (unsigned char)(word); \
461
5.07k
        hbuf[1] = (unsigned char)((word) >> 8); \
462
5.07k
        check = crc32(check, hbuf, 2); \
463
5.07k
    } 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.47M
    do { \
478
3.47M
        put = strm->next_out; \
479
3.47M
        left = strm->avail_out; \
480
3.47M
        next = strm->next_in; \
481
3.47M
        have = strm->avail_in; \
482
3.47M
        hold = state->hold; \
483
3.47M
        bits = state->bits; \
484
3.47M
    } while (0)
485
486
/* Restore state from registers in inflate() */
487
#define RESTORE() \
488
3.47M
    do { \
489
3.47M
        strm->next_out = put; \
490
3.47M
        strm->avail_out = left; \
491
3.47M
        strm->next_in = next; \
492
3.47M
        strm->avail_in = have; \
493
3.47M
        state->hold = hold; \
494
3.47M
        state->bits = bits; \
495
3.47M
    } while (0)
496
497
/* Clear the input bit accumulator */
498
#define INITBITS() \
499
214k
    do { \
500
214k
        hold = 0; \
501
214k
        bits = 0; \
502
214k
    } 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.9M
    do { \
508
10.9M
        if (have == 0) goto inf_leave; \
509
10.9M
        have--; \
510
10.8M
        hold += (unsigned long)(*next++) << bits; \
511
10.8M
        bits += 8; \
512
10.8M
    } 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.46M
    do { \
518
10.5M
        while (bits < (unsigned)(n)) \
519
6.46M
            PULLBYTE(); \
520
6.46M
    } while (0)
521
522
/* Return the low n bits of the bit accumulator (n < 16) */
523
#define BITS(n) \
524
32.4M
    ((unsigned)hold & ((1U << (n)) - 1))
525
526
/* Remove n bits from the bit accumulator */
527
#define DROPBITS(n) \
528
25.4M
    do { \
529
25.4M
        hold >>= (n); \
530
25.4M
        bits -= (unsigned)(n); \
531
25.4M
    } while (0)
532
533
/* Remove zero to seven bits as needed to go to a byte boundary */
534
#define BYTEBITS() \
535
432k
    do { \
536
432k
        hold >>= bits & 7; \
537
432k
        bits -= bits & 7; \
538
432k
    } 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.81M
{
626
1.81M
    struct inflate_state FAR *state;
627
1.81M
    z_const unsigned char FAR *next;    /* next input */
628
1.81M
    unsigned char FAR *put;     /* next output */
629
1.81M
    unsigned have, left;        /* available input and output */
630
1.81M
    unsigned long hold;         /* bit buffer */
631
1.81M
    unsigned bits;              /* bits in bit buffer */
632
1.81M
    unsigned in, out;           /* save starting available input and output */
633
1.81M
    unsigned copy;              /* number of stored or match bytes to copy */
634
1.81M
    unsigned char FAR *from;    /* where to copy match bytes from */
635
1.81M
    code here;                  /* current decoding table entry */
636
1.81M
    code last;                  /* parent table entry */
637
1.81M
    unsigned len;               /* length to copy for repeats, bits to drop */
638
1.81M
    int ret;                    /* return code */
639
1.81M
#ifdef GUNZIP
640
1.81M
    unsigned char hbuf[4];      /* buffer for gzip header crc calculation */
641
1.81M
#endif
642
1.81M
    static const unsigned short order[19] = /* permutation of code lengths */
643
1.81M
        {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15};
644
645
1.81M
    if (inflateStateCheck(strm) || strm->next_out == Z_NULL ||
646
1.81M
        (strm->next_in == Z_NULL && strm->avail_in != 0))
647
0
        return Z_STREAM_ERROR;
648
649
1.81M
    state = (struct inflate_state FAR *)strm->state;
650
1.81M
    if (state->mode == TYPE) state->mode = TYPEDO;      /* skip check */
651
1.81M
    LOAD();
652
1.81M
    in = have;
653
1.81M
    out = left;
654
1.81M
    ret = Z_OK;
655
1.81M
    for (;;)
656
13.1M
        switch (state->mode) {
657
547k
        case HEAD:
658
547k
            if (state->wrap == 0) {
659
387k
                state->mode = TYPEDO;
660
387k
                break;
661
387k
            }
662
159k
            NEEDBITS(16);
663
153k
#ifdef GUNZIP
664
153k
            if ((state->wrap & 2) && hold == 0x8b1f) {  /* gzip header */
665
4.75k
                if (state->wbits == 0)
666
0
                    state->wbits = 15;
667
4.75k
                state->check = crc32(0L, Z_NULL, 0);
668
4.75k
                CRC2(state->check, hold);
669
4.75k
                INITBITS();
670
4.75k
                state->mode = FLAGS;
671
4.75k
                break;
672
4.75k
            }
673
148k
            state->flags = 0;           /* expect zlib header */
674
148k
            if (state->head != Z_NULL)
675
0
                state->head->done = -1;
676
148k
            if (!(state->wrap & 1) ||   /* check if zlib header allowed */
677
#else
678
            if (
679
#endif
680
114k
                ((BITS(8) << 8) + (hold >> 8)) % 31) {
681
39.1k
                strm->msg = (char *)"incorrect header check";
682
39.1k
                state->mode = BAD;
683
39.1k
                break;
684
39.1k
            }
685
109k
            if (BITS(4) != Z_DEFLATED) {
686
3.03k
                strm->msg = (char *)"unknown compression method";
687
3.03k
                state->mode = BAD;
688
3.03k
                break;
689
3.03k
            }
690
106k
            DROPBITS(4);
691
106k
            len = BITS(4) + 8;
692
106k
            if (state->wbits == 0)
693
0
                state->wbits = len;
694
106k
            if (len > 15 || len > state->wbits) {
695
288
                strm->msg = (char *)"invalid window size";
696
288
                state->mode = BAD;
697
288
                break;
698
288
            }
699
105k
            state->dmax = 1U << len;
700
105k
            Tracev((stderr, "inflate:   zlib header ok\n"));
701
105k
            strm->adler = state->check = adler32(0L, Z_NULL, 0);
702
105k
            state->mode = hold & 0x200 ? DICTID : TYPE;
703
105k
            INITBITS();
704
105k
            break;
705
0
#ifdef GUNZIP
706
4.75k
        case FLAGS:
707
4.75k
            NEEDBITS(16);
708
4.75k
            state->flags = (int)(hold);
709
4.75k
            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.74k
            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.74k
            if (state->head != Z_NULL)
720
0
                state->head->text = (int)((hold >> 8) & 1);
721
4.74k
            if ((state->flags & 0x0200) && (state->wrap & 4))
722
134
                CRC2(state->check, hold);
723
4.74k
            INITBITS();
724
4.74k
            state->mode = TIME;
725
4.74k
        case TIME:
726
4.74k
            NEEDBITS(32);
727
4.73k
            if (state->head != Z_NULL)
728
0
                state->head->time = hold;
729
4.73k
            if ((state->flags & 0x0200) && (state->wrap & 4))
730
131
                CRC4(state->check, hold);
731
4.73k
            INITBITS();
732
4.73k
            state->mode = OS;
733
4.73k
        case OS:
734
4.73k
            NEEDBITS(16);
735
4.72k
            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.72k
            if ((state->flags & 0x0200) && (state->wrap & 4))
740
129
                CRC2(state->check, hold);
741
4.72k
            INITBITS();
742
4.72k
            state->mode = EXLEN;
743
4.72k
        case EXLEN:
744
4.72k
            if (state->flags & 0x0400) {
745
98
                NEEDBITS(16);
746
94
                state->length = (unsigned)(hold);
747
94
                if (state->head != Z_NULL)
748
0
                    state->head->extra_len = (unsigned)hold;
749
94
                if ((state->flags & 0x0200) && (state->wrap & 4))
750
57
                    CRC2(state->check, hold);
751
94
                INITBITS();
752
94
            }
753
4.62k
            else if (state->head != Z_NULL)
754
0
                state->head->extra = Z_NULL;
755
4.72k
            state->mode = EXTRA;
756
4.74k
        case EXTRA:
757
4.74k
            if (state->flags & 0x0400) {
758
114
                copy = state->length;
759
114
                if (copy > have) copy = have;
760
114
                if (copy) {
761
77
                    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
77
                    if ((state->flags & 0x0200) && (state->wrap & 4))
769
44
                        state->check = crc32(state->check, next, copy);
770
77
                    have -= copy;
771
77
                    next += copy;
772
77
                    state->length -= copy;
773
77
                }
774
114
                if (state->length) goto inf_leave;
775
114
            }
776
4.68k
            state->length = 0;
777
4.68k
            state->mode = NAME;
778
4.86k
        case NAME:
779
4.86k
            if (state->flags & 0x0800) {
780
1.45k
                if (have == 0) goto inf_leave;
781
1.45k
                copy = 0;
782
5.00M
                do {
783
5.00M
                    len = (unsigned)(next[copy++]);
784
5.00M
                    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
5.00M
                } while (len && copy < have);
789
1.45k
                if ((state->flags & 0x0200) && (state->wrap & 4))
790
135
                    state->check = crc32(state->check, next, copy);
791
1.45k
                have -= copy;
792
1.45k
                next += copy;
793
1.45k
                if (len) goto inf_leave;
794
1.45k
            }
795
3.40k
            else if (state->head != Z_NULL)
796
0
                state->head->name = Z_NULL;
797
4.63k
            state->length = 0;
798
4.63k
            state->mode = COMMENT;
799
4.83k
        case COMMENT:
800
4.83k
            if (state->flags & 0x1000) {
801
429
                if (have == 0) goto inf_leave;
802
426
                copy = 0;
803
3.38M
                do {
804
3.38M
                    len = (unsigned)(next[copy++]);
805
3.38M
                    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.38M
                } while (len && copy < have);
810
426
                if ((state->flags & 0x0200) && (state->wrap & 4))
811
113
                    state->check = crc32(state->check, next, copy);
812
426
                have -= copy;
813
426
                next += copy;
814
426
                if (len) goto inf_leave;
815
426
            }
816
4.41k
            else if (state->head != Z_NULL)
817
0
                state->head->comment = Z_NULL;
818
4.57k
            state->mode = HCRC;
819
4.57k
        case HCRC:
820
4.57k
            if (state->flags & 0x0200) {
821
47
                NEEDBITS(16);
822
36
                if ((state->wrap & 4) && hold != (state->check & 0xffff)) {
823
34
                    strm->msg = (char *)"header crc mismatch";
824
34
                    state->mode = BAD;
825
34
                    break;
826
34
                }
827
2
                INITBITS();
828
2
            }
829
4.52k
            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.52k
            strm->adler = state->check = crc32(0L, Z_NULL, 0);
834
4.52k
            state->mode = TYPE;
835
4.52k
            break;
836
0
#endif
837
709
        case DICTID:
838
709
            NEEDBITS(32);
839
295
            strm->adler = state->check = ZSWAP32(hold);
840
295
            INITBITS();
841
295
            state->mode = DICT;
842
295
        case DICT:
843
295
            if (state->havedict == 0) {
844
295
                RESTORE();
845
295
                return Z_NEED_DICT;
846
295
            }
847
0
            strm->adler = state->check = adler32(0L, Z_NULL, 0);
848
0
            state->mode = TYPE;
849
675k
        case TYPE:
850
675k
            if (flush == Z_BLOCK || flush == Z_TREES) goto inf_leave;
851
1.06M
        case TYPEDO:
852
1.06M
            if (state->last) {
853
370k
                BYTEBITS();
854
370k
                state->mode = CHECK;
855
370k
                break;
856
370k
            }
857
692k
            NEEDBITS(3);
858
690k
            state->last = BITS(1);
859
690k
            DROPBITS(1);
860
690k
            switch (BITS(2)) {
861
59.9k
            case 0:                             /* stored block */
862
59.9k
                Tracev((stderr, "inflate:     stored block%s\n",
863
59.9k
                        state->last ? " (last)" : ""));
864
59.9k
                state->mode = STORED;
865
59.9k
                break;
866
449k
            case 1:                             /* fixed block */
867
449k
                fixedtables(state);
868
449k
                Tracev((stderr, "inflate:     fixed codes block%s\n",
869
449k
                        state->last ? " (last)" : ""));
870
449k
                state->mode = LEN_;             /* decode codes */
871
449k
                if (flush == Z_TREES) {
872
0
                    DROPBITS(2);
873
0
                    goto inf_leave;
874
0
                }
875
449k
                break;
876
449k
            case 2:                             /* dynamic block */
877
178k
                Tracev((stderr, "inflate:     dynamic codes block%s\n",
878
178k
                        state->last ? " (last)" : ""));
879
178k
                state->mode = TABLE;
880
178k
                break;
881
2.59k
            case 3:
882
2.59k
                strm->msg = (char *)"invalid block type";
883
2.59k
                state->mode = BAD;
884
690k
            }
885
690k
            DROPBITS(2);
886
690k
            break;
887
61.2k
        case STORED:
888
61.2k
            BYTEBITS();                         /* go to byte boundary */
889
61.2k
            NEEDBITS(32);
890
57.0k
            if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) {
891
8.01k
                strm->msg = (char *)"invalid stored block lengths";
892
8.01k
                state->mode = BAD;
893
8.01k
                break;
894
8.01k
            }
895
49.0k
            state->length = (unsigned)hold & 0xffff;
896
49.0k
            Tracev((stderr, "inflate:       stored length %u\n",
897
49.0k
                    state->length));
898
49.0k
            INITBITS();
899
49.0k
            state->mode = COPY_;
900
49.0k
            if (flush == Z_TREES) goto inf_leave;
901
49.0k
        case COPY_:
902
49.0k
            state->mode = COPY;
903
60.9k
        case COPY:
904
60.9k
            copy = state->length;
905
60.9k
            if (copy) {
906
15.1k
                if (copy > have) copy = have;
907
15.1k
                if (copy > left) copy = left;
908
15.1k
                if (copy == 0) goto inf_leave;
909
8.71k
                zmemcpy(put, next, copy);
910
8.71k
                have -= copy;
911
8.71k
                next += copy;
912
8.71k
                left -= copy;
913
8.71k
                put += copy;
914
8.71k
                state->length -= copy;
915
8.71k
                break;
916
15.1k
            }
917
45.8k
            Tracev((stderr, "inflate:       stored end\n"));
918
45.8k
            state->mode = TYPE;
919
45.8k
            break;
920
179k
        case TABLE:
921
179k
            NEEDBITS(14);
922
176k
            state->nlen = BITS(5) + 257;
923
176k
            DROPBITS(5);
924
176k
            state->ndist = BITS(5) + 1;
925
176k
            DROPBITS(5);
926
176k
            state->ncode = BITS(4) + 4;
927
176k
            DROPBITS(4);
928
176k
#ifndef PKZIP_BUG_WORKAROUND
929
176k
            if (state->nlen > 286 || state->ndist > 30) {
930
2.63k
                strm->msg = (char *)"too many length or distance symbols";
931
2.63k
                state->mode = BAD;
932
2.63k
                break;
933
2.63k
            }
934
174k
#endif
935
174k
            Tracev((stderr, "inflate:       table sizes ok\n"));
936
174k
            state->have = 0;
937
174k
            state->mode = LENLENS;
938
175k
        case LENLENS:
939
2.79M
            while (state->have < state->ncode) {
940
2.62M
                NEEDBITS(3);
941
2.62M
                state->lens[order[state->have++]] = (unsigned short)BITS(3);
942
2.62M
                DROPBITS(3);
943
2.62M
            }
944
830k
            while (state->have < 19)
945
658k
                state->lens[order[state->have++]] = 0;
946
171k
            state->next = state->codes;
947
171k
            state->lencode = (const code FAR *)(state->next);
948
171k
            state->lenbits = 7;
949
171k
            ret = inflate_table(CODES, state->lens, 19, &(state->next),
950
171k
                                &(state->lenbits), state->work);
951
171k
            if (ret) {
952
22.1k
                strm->msg = (char *)"invalid code lengths set";
953
22.1k
                state->mode = BAD;
954
22.1k
                break;
955
22.1k
            }
956
149k
            Tracev((stderr, "inflate:       code lengths ok\n"));
957
149k
            state->have = 0;
958
149k
            state->mode = CODELENS;
959
153k
        case CODELENS:
960
12.3M
            while (state->have < state->nlen + state->ndist) {
961
16.0M
                for (;;) {
962
16.0M
                    here = state->lencode[BITS(state->lenbits)];
963
16.0M
                    if ((unsigned)(here.bits) <= bits) break;
964
3.80M
                    PULLBYTE();
965
3.80M
                }
966
12.2M
                if (here.val < 16) {
967
10.8M
                    DROPBITS(here.bits);
968
10.8M
                    state->lens[state->have++] = here.val;
969
10.8M
                }
970
1.38M
                else {
971
1.38M
                    if (here.val == 16) {
972
396k
                        NEEDBITS(here.bits + 2);
973
393k
                        DROPBITS(here.bits);
974
393k
                        if (state->have == 0) {
975
1.36k
                            strm->msg = (char *)"invalid bit length repeat";
976
1.36k
                            state->mode = BAD;
977
1.36k
                            break;
978
1.36k
                        }
979
392k
                        len = state->lens[state->have - 1];
980
392k
                        copy = 3 + BITS(2);
981
392k
                        DROPBITS(2);
982
392k
                    }
983
990k
                    else if (here.val == 17) {
984
511k
                        NEEDBITS(here.bits + 3);
985
510k
                        DROPBITS(here.bits);
986
510k
                        len = 0;
987
510k
                        copy = 3 + BITS(3);
988
510k
                        DROPBITS(3);
989
510k
                    }
990
478k
                    else {
991
478k
                        NEEDBITS(here.bits + 7);
992
476k
                        DROPBITS(here.bits);
993
476k
                        len = 0;
994
476k
                        copy = 11 + BITS(7);
995
476k
                        DROPBITS(7);
996
476k
                    }
997
1.37M
                    if (state->have + copy > state->nlen + state->ndist) {
998
6.23k
                        strm->msg = (char *)"invalid bit length repeat";
999
6.23k
                        state->mode = BAD;
1000
6.23k
                        break;
1001
6.23k
                    }
1002
33.0M
                    while (copy--)
1003
31.7M
                        state->lens[state->have++] = (unsigned short)len;
1004
1.37M
                }
1005
12.2M
            }
1006
1007
            /* handle error breaks in while */
1008
141k
            if (state->mode == BAD) break;
1009
1010
            /* check for end-of-block code (better have one) */
1011
133k
            if (state->lens[256] == 0) {
1012
6.26k
                strm->msg = (char *)"invalid code -- missing end-of-block";
1013
6.26k
                state->mode = BAD;
1014
6.26k
                break;
1015
6.26k
            }
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
127k
            state->next = state->codes;
1021
127k
            state->lencode = (const code FAR *)(state->next);
1022
127k
            state->lenbits = 9;
1023
127k
            ret = inflate_table(LENS, state->lens, state->nlen, &(state->next),
1024
127k
                                &(state->lenbits), state->work);
1025
127k
            if (ret) {
1026
5.57k
                strm->msg = (char *)"invalid literal/lengths set";
1027
5.57k
                state->mode = BAD;
1028
5.57k
                break;
1029
5.57k
            }
1030
121k
            state->distcode = (const code FAR *)(state->next);
1031
121k
            state->distbits = 6;
1032
121k
            ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist,
1033
121k
                            &(state->next), &(state->distbits), state->work);
1034
121k
            if (ret) {
1035
4.19k
                strm->msg = (char *)"invalid distances set";
1036
4.19k
                state->mode = BAD;
1037
4.19k
                break;
1038
4.19k
            }
1039
117k
            Tracev((stderr, "inflate:       codes ok\n"));
1040
117k
            state->mode = LEN_;
1041
117k
            if (flush == Z_TREES) goto inf_leave;
1042
566k
        case LEN_:
1043
566k
            state->mode = LEN;
1044
5.55M
        case LEN:
1045
5.55M
            if (have >= 6 && left >= 258) {
1046
1.65M
                RESTORE();
1047
1.65M
                inflate_fast(strm, out);
1048
1.65M
                LOAD();
1049
1.65M
                if (state->mode == TYPE)
1050
418k
                    state->back = -1;
1051
1.65M
                break;
1052
1.65M
            }
1053
3.89M
            state->back = 0;
1054
6.24M
            for (;;) {
1055
6.24M
                here = state->lencode[BITS(state->lenbits)];
1056
6.24M
                if ((unsigned)(here.bits) <= bits) break;
1057
2.37M
                PULLBYTE();
1058
2.37M
            }
1059
3.86M
            if (here.op && (here.op & 0xf0) == 0) {
1060
80.4k
                last = here;
1061
112k
                for (;;) {
1062
112k
                    here = state->lencode[last.val +
1063
112k
                            (BITS(last.bits + last.op) >> last.bits)];
1064
112k
                    if ((unsigned)(last.bits + here.bits) <= bits) break;
1065
32.6k
                    PULLBYTE();
1066
32.6k
                }
1067
79.7k
                DROPBITS(last.bits);
1068
79.7k
                state->back += last.bits;
1069
79.7k
            }
1070
3.86M
            DROPBITS(here.bits);
1071
3.86M
            state->back += here.bits;
1072
3.86M
            state->length = (unsigned)here.val;
1073
3.86M
            if ((int)(here.op) == 0) {
1074
1.83M
                Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?
1075
1.83M
                        "inflate:         literal '%c'\n" :
1076
1.83M
                        "inflate:         literal 0x%02x\n", here.val));
1077
1.83M
                state->mode = LIT;
1078
1.83M
                break;
1079
1.83M
            }
1080
2.03M
            if (here.op & 32) {
1081
100k
                Tracevv((stderr, "inflate:         end of block\n"));
1082
100k
                state->back = -1;
1083
100k
                state->mode = TYPE;
1084
100k
                break;
1085
100k
            }
1086
1.93M
            if (here.op & 64) {
1087
1.25k
                strm->msg = (char *)"invalid literal/length code";
1088
1.25k
                state->mode = BAD;
1089
1.25k
                break;
1090
1.25k
            }
1091
1.93M
            state->extra = (unsigned)(here.op) & 15;
1092
1.93M
            state->mode = LENEXT;
1093
1.93M
        case LENEXT:
1094
1.93M
            if (state->extra) {
1095
429k
                NEEDBITS(state->extra);
1096
425k
                state->length += BITS(state->extra);
1097
425k
                DROPBITS(state->extra);
1098
425k
                state->back += state->extra;
1099
425k
            }
1100
1.92M
            Tracevv((stderr, "inflate:         length %u\n", state->length));
1101
1.92M
            state->was = state->length;
1102
1.92M
            state->mode = DIST;
1103
1.93M
        case DIST:
1104
2.50M
            for (;;) {
1105
2.50M
                here = state->distcode[BITS(state->distbits)];
1106
2.50M
                if ((unsigned)(here.bits) <= bits) break;
1107
583k
                PULLBYTE();
1108
583k
            }
1109
1.92M
            if ((here.op & 0xf0) == 0) {
1110
51.5k
                last = here;
1111
69.0k
                for (;;) {
1112
69.0k
                    here = state->distcode[last.val +
1113
69.0k
                            (BITS(last.bits + last.op) >> last.bits)];
1114
69.0k
                    if ((unsigned)(last.bits + here.bits) <= bits) break;
1115
18.6k
                    PULLBYTE();
1116
18.6k
                }
1117
50.3k
                DROPBITS(last.bits);
1118
50.3k
                state->back += last.bits;
1119
50.3k
            }
1120
1.92M
            DROPBITS(here.bits);
1121
1.92M
            state->back += here.bits;
1122
1.92M
            if (here.op & 64) {
1123
1.42k
                strm->msg = (char *)"invalid distance code";
1124
1.42k
                state->mode = BAD;
1125
1.42k
                break;
1126
1.42k
            }
1127
1.92M
            state->offset = (unsigned)here.val;
1128
1.92M
            state->extra = (unsigned)(here.op) & 15;
1129
1.92M
            state->mode = DISTEXT;
1130
1.92M
        case DISTEXT:
1131
1.92M
            if (state->extra) {
1132
863k
                NEEDBITS(state->extra);
1133
856k
                state->offset += BITS(state->extra);
1134
856k
                DROPBITS(state->extra);
1135
856k
                state->back += state->extra;
1136
856k
            }
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.91M
            Tracevv((stderr, "inflate:         distance %u\n", state->offset));
1145
1.91M
            state->mode = MATCH;
1146
5.40M
        case MATCH:
1147
5.40M
            if (left == 0) goto inf_leave;
1148
4.17M
            copy = out - left;
1149
4.17M
            if (state->offset > copy) {         /* copy from window */
1150
1.30M
                copy = state->offset - copy;
1151
1.30M
                if (copy > state->whave) {
1152
2.25k
                    if (state->sane) {
1153
2.25k
                        strm->msg = (char *)"invalid distance too far back";
1154
2.25k
                        state->mode = BAD;
1155
2.25k
                        break;
1156
2.25k
                    }
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.25k
                }
1171
1.30M
                if (copy > state->wnext) {
1172
184k
                    copy -= state->wnext;
1173
184k
                    from = state->window + (state->wsize - copy);
1174
184k
                }
1175
1.11M
                else
1176
1.11M
                    from = state->window + (state->wnext - copy);
1177
1.30M
                if (copy > state->length) copy = state->length;
1178
1.30M
            }
1179
2.87M
            else {                              /* copy from output */
1180
2.87M
                from = put - state->offset;
1181
2.87M
                copy = state->length;
1182
2.87M
            }
1183
4.17M
            if (copy > left) copy = left;
1184
4.17M
            left -= copy;
1185
4.17M
            state->length -= copy;
1186
317M
            do {
1187
317M
                *put++ = *from++;
1188
317M
            } while (--copy);
1189
4.17M
            if (state->length == 0) state->mode = LEN;
1190
4.17M
            break;
1191
1.84M
        case LIT:
1192
1.84M
            if (left == 0) goto inf_leave;
1193
1.83M
            *put++ = (unsigned char)(state->length);
1194
1.83M
            left--;
1195
1.83M
            state->mode = LEN;
1196
1.83M
            break;
1197
374k
        case CHECK:
1198
374k
            if (state->wrap) {
1199
53.5k
                NEEDBITS(32);
1200
44.5k
                out -= left;
1201
44.5k
                strm->total_out += out;
1202
44.5k
                state->total += out;
1203
44.5k
                if ((state->wrap & 4) && out)
1204
42.0k
                    strm->adler = state->check =
1205
42.0k
                        UPDATE(state->check, put - out, out);
1206
44.5k
                out = left;
1207
44.5k
                if ((state->wrap & 4) && (
1208
44.5k
#ifdef GUNZIP
1209
44.5k
                     state->flags ? hold :
1210
44.5k
#endif
1211
44.5k
                     ZSWAP32(hold)) != state->check) {
1212
4.29k
                    strm->msg = (char *)"incorrect data check";
1213
4.29k
                    state->mode = BAD;
1214
4.29k
                    break;
1215
4.29k
                }
1216
40.2k
                INITBITS();
1217
40.2k
                Tracev((stderr, "inflate:   check matches trailer\n"));
1218
40.2k
            }
1219
361k
#ifdef GUNZIP
1220
361k
            state->mode = LENGTH;
1221
361k
        case LENGTH:
1222
361k
            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
361k
#endif
1233
361k
            state->mode = DONE;
1234
361k
        case DONE:
1235
361k
            ret = Z_STREAM_END;
1236
361k
            goto inf_leave;
1237
123k
        case BAD:
1238
123k
            ret = Z_DATA_ERROR;
1239
123k
            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
13.1M
        }
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.81M
  inf_leave:
1254
1.81M
    RESTORE();
1255
1.81M
    if (state->wsize || (out != strm->avail_out && state->mode < BAD &&
1256
367k
            (state->mode < CHECK || flush != Z_FINISH)))
1257
1.63M
        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.81M
    in -= strm->avail_in;
1262
1.81M
    out -= strm->avail_out;
1263
1.81M
    strm->total_in += in;
1264
1.81M
    strm->total_out += out;
1265
1.81M
    state->total += out;
1266
1.81M
    if ((state->wrap & 4) && out)
1267
661k
        strm->adler = state->check =
1268
661k
            UPDATE(state->check, strm->next_out - out, out);
1269
1.81M
    strm->data_type = (int)state->bits + (state->last ? 64 : 0) +
1270
1.81M
                      (state->mode == TYPE ? 128 : 0) +
1271
1.81M
                      (state->mode == LEN_ || state->mode == COPY_ ? 256 : 0);
1272
1.81M
    if (((in == 0 && out == 0) || flush == Z_FINISH) && ret == Z_OK)
1273
44.2k
        ret = Z_BUF_ERROR;
1274
1.81M
    return ret;
1275
1.81M
}
1276
1277
int ZEXPORT inflateEnd(strm)
1278
z_streamp strm;
1279
547k
{
1280
547k
    struct inflate_state FAR *state;
1281
547k
    if (inflateStateCheck(strm))
1282
0
        return Z_STREAM_ERROR;
1283
547k
    state = (struct inflate_state FAR *)strm->state;
1284
547k
    if (state->window != Z_NULL) ZFREE(strm, state->window);
1285
547k
    ZFREE(strm, strm->state);
1286
547k
    strm->state = Z_NULL;
1287
547k
    Tracev((stderr, "inflate: end\n"));
1288
547k
    return Z_OK;
1289
547k
}
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
}