Coverage Report

Created: 2025-11-09 06:41

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/zlib-ng/inflate.c
Line
Count
Source
1
/* inflate.c -- zlib decompression
2
 * Copyright (C) 1995-2022 Mark Adler
3
 * For conditions of distribution and use, see copyright notice in zlib.h
4
 */
5
6
#include "zbuild.h"
7
#include "zutil.h"
8
#include "inftrees.h"
9
#include "inflate.h"
10
#include "inflate_p.h"
11
#include "inffixed_tbl.h"
12
#include "functable.h"
13
14
/* Avoid conflicts with zlib.h macros */
15
#ifdef ZLIB_COMPAT
16
# undef inflateInit
17
# undef inflateInit2
18
#endif
19
20
/* function prototypes */
21
static int inflateStateCheck(PREFIX3(stream) *strm);
22
static void updatewindow(PREFIX3(stream) *strm, const uint8_t *end, uint32_t len, int32_t cksum);
23
static uint32_t syncsearch(uint32_t *have, const unsigned char *buf, uint32_t len);
24
25
static inline void inf_chksum_cpy(PREFIX3(stream) *strm, uint8_t *dst,
26
148M
                           const uint8_t *src, uint32_t copy) {
27
148M
    if (!copy) return;
28
146M
    struct inflate_state *state = (struct inflate_state*)strm->state;
29
146M
#ifdef GUNZIP
30
146M
    if (state->flags) {
31
2.47k
        FUNCTABLE_CALL(crc32_fold_copy)(&state->crc_fold, dst, src, copy);
32
2.47k
    } else
33
146M
#endif
34
146M
    {
35
146M
        strm->adler = state->check = FUNCTABLE_CALL(adler32_fold_copy)(state->check, dst, src, copy);
36
146M
    }
37
146M
}
38
39
38.0k
static inline void inf_chksum(PREFIX3(stream) *strm, const uint8_t *src, uint32_t len) {
40
38.0k
    struct inflate_state *state = (struct inflate_state*)strm->state;
41
38.0k
#ifdef GUNZIP
42
38.0k
    if (state->flags) {
43
8.15k
        FUNCTABLE_CALL(crc32_fold)(&state->crc_fold, src, len, 0);
44
8.15k
    } else
45
29.9k
#endif
46
29.9k
    {
47
29.9k
        strm->adler = state->check = FUNCTABLE_CALL(adler32)(state->check, src, len);
48
29.9k
    }
49
38.0k
}
50
51
148M
static int inflateStateCheck(PREFIX3(stream) *strm) {
52
148M
    struct inflate_state *state;
53
148M
    if (strm == NULL || strm->zalloc == NULL || strm->zfree == NULL)
54
0
        return 1;
55
148M
    state = (struct inflate_state *)strm->state;
56
148M
    if (state == NULL || state->alloc_bufs == NULL || state->strm != strm || state->mode < HEAD || state->mode > SYNC)
57
0
        return 1;
58
148M
    return 0;
59
148M
}
60
61
53.0k
int32_t Z_EXPORT PREFIX(inflateResetKeep)(PREFIX3(stream) *strm) {
62
53.0k
    struct inflate_state *state;
63
64
53.0k
    if (inflateStateCheck(strm))
65
0
        return Z_STREAM_ERROR;
66
53.0k
    state = (struct inflate_state *)strm->state;
67
53.0k
    strm->total_in = strm->total_out = state->total = 0;
68
53.0k
    strm->msg = NULL;
69
53.0k
    if (state->wrap)        /* to support ill-conceived Java test suite */
70
53.0k
        strm->adler = state->wrap & 1;
71
53.0k
    state->mode = HEAD;
72
53.0k
    state->check = ADLER32_INITIAL_VALUE;
73
53.0k
    state->last = 0;
74
53.0k
    state->havedict = 0;
75
53.0k
    state->flags = -1;
76
53.0k
    state->head = NULL;
77
53.0k
    state->hold = 0;
78
53.0k
    state->bits = 0;
79
53.0k
    state->lencode = state->distcode = state->next = state->codes;
80
53.0k
    state->back = -1;
81
#ifdef INFLATE_STRICT
82
    state->dmax = 32768U;
83
#endif
84
#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR
85
    state->sane = 1;
86
#endif
87
53.0k
    INFLATE_RESET_KEEP_HOOK(strm);  /* hook for IBM Z DFLTCC */
88
53.0k
    Tracev((stderr, "inflate: reset\n"));
89
53.0k
    return Z_OK;
90
53.0k
}
91
92
53.0k
int32_t Z_EXPORT PREFIX(inflateReset)(PREFIX3(stream) *strm) {
93
53.0k
    struct inflate_state *state;
94
95
53.0k
    if (inflateStateCheck(strm))
96
0
        return Z_STREAM_ERROR;
97
53.0k
    state = (struct inflate_state *)strm->state;
98
53.0k
    state->wsize = 0;
99
53.0k
    state->whave = 0;
100
53.0k
    state->wnext = 0;
101
53.0k
    return PREFIX(inflateResetKeep)(strm);
102
53.0k
}
103
104
43.9k
int32_t Z_EXPORT PREFIX(inflateReset2)(PREFIX3(stream) *strm, int32_t windowBits) {
105
43.9k
    int wrap;
106
43.9k
    struct inflate_state *state;
107
108
    /* get the state */
109
43.9k
    if (inflateStateCheck(strm))
110
0
        return Z_STREAM_ERROR;
111
43.9k
    state = (struct inflate_state *)strm->state;
112
113
    /* extract wrap request from windowBits parameter */
114
43.9k
    if (windowBits < 0) {
115
0
        wrap = 0;
116
0
        if (windowBits < -MAX_WBITS)
117
0
            return Z_STREAM_ERROR;
118
0
        windowBits = -windowBits;
119
43.9k
    } else {
120
43.9k
        wrap = (windowBits >> 4) + 5;
121
43.9k
#ifdef GUNZIP
122
43.9k
        if (windowBits < 48)
123
43.9k
            windowBits &= MAX_WBITS;
124
43.9k
#endif
125
43.9k
    }
126
127
    /* set number of window bits */
128
43.9k
    if (windowBits && (windowBits < MIN_WBITS || windowBits > MAX_WBITS))
129
0
        return Z_STREAM_ERROR;
130
131
    /* update state and reset the rest of it */
132
43.9k
    state->wrap = wrap;
133
43.9k
    state->wbits = (unsigned)windowBits;
134
43.9k
    return PREFIX(inflateReset)(strm);
135
43.9k
}
136
137
#ifdef INF_ALLOC_DEBUG
138
#  include <stdio.h>
139
#  define LOGSZ(name,size)           fprintf(stderr, "%s is %d bytes\n", name, size)
140
#  define LOGSZP(name,size,loc,pad)  fprintf(stderr, "%s is %d bytes, offset %d, padded %d\n", name, size, loc, pad)
141
#  define LOGSZPL(name,size,loc,pad) fprintf(stderr, "%s is %d bytes, offset %ld, padded %d\n", name, size, loc, pad)
142
#else
143
#  define LOGSZ(name,size)
144
#  define LOGSZP(name,size,loc,pad)
145
#  define LOGSZPL(name,size,loc,pad)
146
#endif
147
148
/* ===========================================================================
149
 * Allocate a big buffer and divide it up into the various buffers inflate needs.
150
 * Handles alignment of allocated buffer and alignment of individual buffers.
151
 */
152
43.9k
Z_INTERNAL inflate_allocs* alloc_inflate(PREFIX3(stream) *strm) {
153
43.9k
    int curr_size = 0;
154
155
    /* Define sizes */
156
43.9k
    int window_size = INFLATE_ADJUST_WINDOW_SIZE((1 << MAX_WBITS) + 64); /* 64B padding for chunksize */
157
43.9k
    int state_size = sizeof(inflate_state);
158
43.9k
    int alloc_size = sizeof(inflate_allocs);
159
160
    /* Calculate relative buffer positions and paddings */
161
43.9k
    LOGSZP("window", window_size, PAD_WINDOW(curr_size), PADSZ(curr_size,WINDOW_PAD_SIZE));
162
43.9k
    int window_pos = PAD_WINDOW(curr_size);
163
43.9k
    curr_size = window_pos + window_size;
164
165
43.9k
    LOGSZP("state", state_size, PAD_64(curr_size), PADSZ(curr_size,64));
166
43.9k
    int state_pos = PAD_64(curr_size);
167
43.9k
    curr_size = state_pos + state_size;
168
169
43.9k
    LOGSZP("alloc", alloc_size, PAD_16(curr_size), PADSZ(curr_size,16));
170
43.9k
    int alloc_pos = PAD_16(curr_size);
171
43.9k
    curr_size = alloc_pos + alloc_size;
172
173
    /* Add 64-1 or 4096-1 to allow window alignment, and round size of buffer up to multiple of 64 */
174
43.9k
    int total_size = PAD_64(curr_size + (WINDOW_PAD_SIZE - 1));
175
176
    /* Allocate buffer, align to 64-byte cacheline, and zerofill the resulting buffer */
177
43.9k
    char *original_buf = (char *)strm->zalloc(strm->opaque, 1, total_size);
178
43.9k
    if (original_buf == NULL)
179
0
        return NULL;
180
181
43.9k
    char *buff = (char *)HINT_ALIGNED_WINDOW((char *)PAD_WINDOW(original_buf));
182
43.9k
    LOGSZPL("Buffer alloc", total_size, PADSZ((uintptr_t)original_buf,WINDOW_PAD_SIZE), PADSZ(curr_size,WINDOW_PAD_SIZE));
183
184
    /* Initialize alloc_bufs */
185
43.9k
    inflate_allocs *alloc_bufs  = (struct inflate_allocs_s *)(buff + alloc_pos);
186
43.9k
    alloc_bufs->buf_start = original_buf;
187
43.9k
    alloc_bufs->zfree = strm->zfree;
188
189
43.9k
    alloc_bufs->window =  (unsigned char *)HINT_ALIGNED_WINDOW((buff + window_pos));
190
43.9k
    alloc_bufs->state = (inflate_state *)HINT_ALIGNED_64((buff + state_pos));
191
192
#ifdef Z_MEMORY_SANITIZER
193
    /* This is _not_ to subvert the memory sanitizer but to instead unposion some
194
       data we willingly and purposefully load uninitialized into vector registers
195
       in order to safely read the last < chunksize bytes of the window. */
196
    __msan_unpoison(alloc_bufs->window + window_size, 64);
197
#endif
198
199
43.9k
    return alloc_bufs;
200
43.9k
}
201
202
/* ===========================================================================
203
 * Free all allocated inflate buffers
204
 */
205
43.9k
Z_INTERNAL void free_inflate(PREFIX3(stream) *strm) {
206
43.9k
    struct inflate_state *state = (struct inflate_state *)strm->state;
207
208
43.9k
    if (state->alloc_bufs != NULL) {
209
43.9k
        inflate_allocs *alloc_bufs = state->alloc_bufs;
210
43.9k
        alloc_bufs->zfree(strm->opaque, alloc_bufs->buf_start);
211
43.9k
        strm->state = NULL;
212
43.9k
    }
213
43.9k
}
214
215
/* ===========================================================================
216
 * Initialize inflate state and buffers.
217
 * This function is hidden in ZLIB_COMPAT builds.
218
 */
219
43.9k
int32_t ZNG_CONDEXPORT PREFIX(inflateInit2)(PREFIX3(stream) *strm, int32_t windowBits) {
220
43.9k
    struct inflate_state *state;
221
43.9k
    int32_t ret;
222
223
    /* Initialize functable */
224
43.9k
    FUNCTABLE_INIT;
225
226
43.9k
    if (strm == NULL)
227
0
        return Z_STREAM_ERROR;
228
43.9k
    strm->msg = NULL;                   /* in case we return an error */
229
43.9k
    if (strm->zalloc == NULL) {
230
43.9k
        strm->zalloc = PREFIX(zcalloc);
231
43.9k
        strm->opaque = NULL;
232
43.9k
    }
233
43.9k
    if (strm->zfree == NULL)
234
43.9k
        strm->zfree = PREFIX(zcfree);
235
236
43.9k
    inflate_allocs *alloc_bufs = alloc_inflate(strm);
237
43.9k
    if (alloc_bufs == NULL)
238
0
        return Z_MEM_ERROR;
239
240
43.9k
    state = alloc_bufs->state;
241
43.9k
    state->window = alloc_bufs->window;
242
43.9k
    state->alloc_bufs = alloc_bufs;
243
43.9k
    state->wbufsize = INFLATE_ADJUST_WINDOW_SIZE((1 << MAX_WBITS) + 64);
244
43.9k
    Tracev((stderr, "inflate: allocated\n"));
245
246
43.9k
    strm->state = (struct internal_state *)state;
247
43.9k
    state->strm = strm;
248
43.9k
    state->mode = HEAD;     /* to pass state test in inflateReset2() */
249
43.9k
    ret = PREFIX(inflateReset2)(strm, windowBits);
250
43.9k
    if (ret != Z_OK) {
251
0
        free_inflate(strm);
252
0
    }
253
43.9k
    return ret;
254
43.9k
}
255
256
#ifndef ZLIB_COMPAT
257
37.8k
int32_t Z_EXPORT PREFIX(inflateInit)(PREFIX3(stream) *strm) {
258
37.8k
    return PREFIX(inflateInit2)(strm, DEF_WBITS);
259
37.8k
}
260
#endif
261
262
/* Function used by zlib.h and zlib-ng version 2.0 macros */
263
0
int32_t Z_EXPORT PREFIX(inflateInit_)(PREFIX3(stream) *strm, const char *version, int32_t stream_size) {
264
0
    if (CHECK_VER_STSIZE(version, stream_size))
265
0
        return Z_VERSION_ERROR;
266
0
    return PREFIX(inflateInit2)(strm, DEF_WBITS);
267
0
}
268
269
/* Function used by zlib.h and zlib-ng version 2.0 macros */
270
0
int32_t Z_EXPORT PREFIX(inflateInit2_)(PREFIX3(stream) *strm, int32_t windowBits, const char *version, int32_t stream_size) {
271
0
    if (CHECK_VER_STSIZE(version, stream_size))
272
0
        return Z_VERSION_ERROR;
273
0
    return PREFIX(inflateInit2)(strm, windowBits);
274
0
}
275
276
0
int32_t Z_EXPORT PREFIX(inflatePrime)(PREFIX3(stream) *strm, int32_t bits, int32_t value) {
277
0
    struct inflate_state *state;
278
279
0
    if (inflateStateCheck(strm))
280
0
        return Z_STREAM_ERROR;
281
0
    if (bits == 0)
282
0
        return Z_OK;
283
0
    INFLATE_PRIME_HOOK(strm, bits, value);  /* hook for IBM Z DFLTCC */
284
0
    state = (struct inflate_state *)strm->state;
285
0
    if (bits < 0) {
286
0
        state->hold = 0;
287
0
        state->bits = 0;
288
0
        return Z_OK;
289
0
    }
290
0
    if (bits > 16 || state->bits + (unsigned int)bits > 32)
291
0
        return Z_STREAM_ERROR;
292
0
    value &= (1L << bits) - 1;
293
0
    state->hold += (uint64_t)value << state->bits;
294
0
    state->bits += (unsigned int)bits;
295
0
    return Z_OK;
296
0
}
297
298
/*
299
   Return state with length and distance decoding tables and index sizes set to
300
   fixed code decoding.  This returns fixed tables from inffixed_tbl.h.
301
 */
302
303
6.04M
void Z_INTERNAL PREFIX(fixedtables)(struct inflate_state *state) {
304
6.04M
    state->lencode = lenfix;
305
6.04M
    state->lenbits = 9;
306
6.04M
    state->distcode = distfix;
307
6.04M
    state->distbits = 5;
308
6.04M
}
309
310
/*
311
   Update the window with the last wsize (normally 32K) bytes written before
312
   returning.  If window does not exist yet, create it.  This is only called
313
   when a window is already in use, or when output has been written during this
314
   inflate call, but the end of the deflate stream has not been reached yet.
315
   It is also called to create a window for dictionary data when a dictionary
316
   is loaded.
317
318
   Providing output buffers larger than 32K to inflate() should provide a speed
319
   advantage, since only the last 32K of output is copied to the sliding window
320
   upon return from inflate(), and since all distances after the first 32K of
321
   output will fall in the output data, making match copies simpler and faster.
322
   The advantage may be dependent on the size of the processor's data caches.
323
 */
324
148M
static void updatewindow(PREFIX3(stream) *strm, const uint8_t *end, uint32_t len, int32_t cksum) {
325
148M
    struct inflate_state *state;
326
148M
    uint32_t dist;
327
328
148M
    state = (struct inflate_state *)strm->state;
329
330
    /* if window not in use yet, initialize */
331
148M
    if (state->wsize == 0)
332
15.6k
        state->wsize = 1U << state->wbits;
333
334
    /* len state->wsize or less output bytes into the circular window */
335
148M
    if (len >= state->wsize) {
336
        /* Only do this if the caller specifies to checksum bytes AND the platform requires
337
         * it (s/390 being the primary exception to this) */
338
3.51k
        if (INFLATE_NEED_CHECKSUM(strm) && cksum) {
339
            /* We have to split the checksum over non-copied and copied bytes */
340
3.51k
            if (len > state->wsize)
341
3.50k
                inf_chksum(strm, end - len, len - state->wsize);
342
3.51k
            inf_chksum_cpy(strm, state->window, end - state->wsize, state->wsize);
343
3.51k
        } else {
344
0
            memcpy(state->window, end - state->wsize, state->wsize);
345
0
        }
346
347
3.51k
        state->wnext = 0;
348
3.51k
        state->whave = state->wsize;
349
148M
    } else {
350
148M
        dist = state->wsize - state->wnext;
351
        /* Only do this if the caller specifies to checksum bytes AND the platform requires
352
         * We need to maintain the correct order here for the checksum */
353
148M
        dist = MIN(dist, len);
354
148M
        if (INFLATE_NEED_CHECKSUM(strm) && cksum) {
355
148M
            inf_chksum_cpy(strm, state->window + state->wnext, end - len, dist);
356
148M
        } else {
357
10.0k
            memcpy(state->window + state->wnext, end - len, dist);
358
10.0k
        }
359
148M
        len -= dist;
360
148M
        if (len) {
361
158
            if (INFLATE_NEED_CHECKSUM(strm) && cksum) {
362
158
                inf_chksum_cpy(strm, state->window, end - len, len);
363
158
            } else {
364
0
                memcpy(state->window, end - len, len);
365
0
            }
366
367
158
            state->wnext = len;
368
158
            state->whave = state->wsize;
369
148M
        } else {
370
148M
            state->wnext += dist;
371
148M
            if (state->wnext == state->wsize)
372
4.08k
                state->wnext = 0;
373
148M
            if (state->whave < state->wsize)
374
21.9M
                state->whave += dist;
375
148M
        }
376
148M
    }
377
148M
}
378
379
/*
380
   Private macros for inflate()
381
   Look in inflate_p.h for macros shared with inflateBack()
382
*/
383
384
/* Get a byte of input into the bit accumulator, or return from inflate() if there is no input available. */
385
#define PULLBYTE() \
386
134M
    do { \
387
134M
        if (have == 0) goto inf_leave; \
388
134M
        have--; \
389
97.0M
        hold += ((uint64_t)(*next++) << bits); \
390
97.0M
        bits += 8; \
391
97.0M
    } while (0)
392
393
/*
394
   inflate() uses a state machine to process as much input data and generate as
395
   much output data as possible before returning.  The state machine is
396
   structured roughly as follows:
397
398
    for (;;) switch (state) {
399
    ...
400
    case STATEn:
401
        if (not enough input data or output space to make progress)
402
            return;
403
        ... make progress ...
404
        state = STATEm;
405
        break;
406
    ...
407
    }
408
409
   so when inflate() is called again, the same case is attempted again, and
410
   if the appropriate resources are provided, the machine proceeds to the
411
   next state.  The NEEDBITS() macro is usually the way the state evaluates
412
   whether it can proceed or should return.  NEEDBITS() does the return if
413
   the requested bits are not available.  The typical use of the BITS macros
414
   is:
415
416
        NEEDBITS(n);
417
        ... do something with BITS(n) ...
418
        DROPBITS(n);
419
420
   where NEEDBITS(n) either returns from inflate() if there isn't enough
421
   input left to load n bits into the accumulator, or it continues.  BITS(n)
422
   gives the low n bits in the accumulator.  When done, DROPBITS(n) drops
423
   the low n bits off the accumulator.  INITBITS() clears the accumulator
424
   and sets the number of available bits to zero.  BYTEBITS() discards just
425
   enough bits to put the accumulator on a byte boundary.  After BYTEBITS()
426
   and a NEEDBITS(8), then BITS(8) would return the next byte in the stream.
427
428
   NEEDBITS(n) uses PULLBYTE() to get an available byte of input, or to return
429
   if there is no input available.  The decoding of variable length codes uses
430
   PULLBYTE() directly in order to pull just enough bytes to decode the next
431
   code, and no more.
432
433
   Some states loop until they get enough input, making sure that enough
434
   state information is maintained to continue the loop where it left off
435
   if NEEDBITS() returns in the loop.  For example, want, need, and keep
436
   would all have to actually be part of the saved state in case NEEDBITS()
437
   returns:
438
439
    case STATEw:
440
        while (want < need) {
441
            NEEDBITS(n);
442
            keep[want++] = BITS(n);
443
            DROPBITS(n);
444
        }
445
        state = STATEx;
446
    case STATEx:
447
448
   As shown above, if the next state is also the next case, then the break
449
   is omitted.
450
451
   A state may also return if there is not enough output space available to
452
   complete that state.  Those states are copying stored data, writing a
453
   literal byte, and copying a matching string.
454
455
   When returning, a "goto inf_leave" is used to update the total counters,
456
   update the check value, and determine whether any progress has been made
457
   during that inflate() call in order to return the proper return code.
458
   Progress is defined as a change in either strm->avail_in or strm->avail_out.
459
   When there is a window, goto inf_leave will update the window with the last
460
   output written.  If a goto inf_leave occurs in the middle of decompression
461
   and there is no window currently, goto inf_leave will create one and copy
462
   output to the window for the next call of inflate().
463
464
   In this implementation, the flush parameter of inflate() only affects the
465
   return code (per zlib.h).  inflate() always writes as much as possible to
466
   strm->next_out, given the space available and the provided input--the effect
467
   documented in zlib.h of Z_SYNC_FLUSH.  Furthermore, inflate() always defers
468
   the allocation of and copying into a sliding window until necessary, which
469
   provides the effect documented in zlib.h for Z_FINISH when the entire input
470
   stream available.  So the only thing the flush parameter actually does is:
471
   when flush is set to Z_FINISH, inflate() cannot return Z_OK.  Instead it
472
   will return Z_BUF_ERROR if it has not reached the end of the stream.
473
 */
474
475
148M
int32_t Z_EXPORT PREFIX(inflate)(PREFIX3(stream) *strm, int32_t flush) {
476
148M
    struct inflate_state *state;
477
148M
    const unsigned char *next;  /* next input */
478
148M
    unsigned char *put;         /* next output */
479
148M
    unsigned char *from;        /* where to copy match bytes from */
480
148M
    unsigned have, left;        /* available input and output */
481
148M
    uint64_t hold;              /* bit buffer */
482
148M
    unsigned bits;              /* bits in bit buffer */
483
148M
    uint32_t in, out;           /* save starting available input and output */
484
148M
    unsigned copy;              /* number of stored or match bytes to copy */
485
148M
    code here;                  /* current decoding table entry */
486
148M
    code last;                  /* parent table entry */
487
148M
    unsigned len;               /* length to copy for repeats, bits to drop */
488
148M
    int32_t ret;                /* return code */
489
148M
#ifdef GUNZIP
490
148M
    unsigned char hbuf[4];      /* buffer for gzip header crc calculation */
491
148M
#endif
492
148M
    static const uint16_t order[19] = /* permutation of code lengths */
493
148M
        {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15};
494
495
148M
    if (inflateStateCheck(strm) || strm->next_out == NULL ||
496
148M
        (strm->next_in == NULL && strm->avail_in != 0))
497
0
        return Z_STREAM_ERROR;
498
499
148M
    state = (struct inflate_state *)strm->state;
500
148M
    if (state->mode == TYPE)      /* skip check */
501
8.45k
        state->mode = TYPEDO;
502
148M
    LOAD();
503
148M
    in = have;
504
148M
    out = left;
505
148M
    ret = Z_OK;
506
148M
    for (;;)
507
399M
        switch (state->mode) {
508
46.4k
        case HEAD:
509
46.4k
            if (state->wrap == 0) {
510
0
                state->mode = TYPEDO;
511
0
                break;
512
0
            }
513
46.4k
            NEEDBITS(16);
514
43.9k
#ifdef GUNZIP
515
43.9k
            if ((state->wrap & 2) && hold == 0x8b1f) {  /* gzip header */
516
6.11k
                if (state->wbits == 0)
517
0
                    state->wbits = MAX_WBITS;
518
6.11k
                state->check = CRC32_INITIAL_VALUE;
519
6.11k
                CRC2(state->check, hold);
520
6.11k
                INITBITS();
521
6.11k
                state->mode = FLAGS;
522
6.11k
                break;
523
6.11k
            }
524
37.8k
            if (state->head != NULL)
525
0
                state->head->done = -1;
526
37.8k
            if (!(state->wrap & 1) ||   /* check if zlib header allowed */
527
#else
528
            if (
529
#endif
530
37.8k
                ((BITS(8) << 8) + (hold >> 8)) % 31) {
531
0
                SET_BAD("incorrect header check");
532
0
                break;
533
0
            }
534
37.8k
            if (BITS(4) != Z_DEFLATED) {
535
0
                SET_BAD("unknown compression method");
536
0
                break;
537
0
            }
538
37.8k
            DROPBITS(4);
539
37.8k
            len = BITS(4) + 8;
540
37.8k
            if (state->wbits == 0)
541
0
                state->wbits = len;
542
37.8k
            if (len > MAX_WBITS || len > state->wbits) {
543
0
                SET_BAD("invalid window size");
544
0
                break;
545
0
            }
546
#ifdef INFLATE_STRICT
547
            state->dmax = 1U << len;
548
#endif
549
37.8k
            state->flags = 0;               /* indicate zlib header */
550
37.8k
            Tracev((stderr, "inflate:   zlib header ok\n"));
551
37.8k
            strm->adler = state->check = ADLER32_INITIAL_VALUE;
552
37.8k
            state->mode = hold & 0x200 ? DICTID : TYPE;
553
37.8k
            INITBITS();
554
37.8k
            break;
555
0
#ifdef GUNZIP
556
557
6.11k
        case FLAGS:
558
6.11k
            NEEDBITS(16);
559
6.11k
            state->flags = (int)(hold);
560
6.11k
            if ((state->flags & 0xff) != Z_DEFLATED) {
561
0
                SET_BAD("unknown compression method");
562
0
                break;
563
0
            }
564
6.11k
            if (state->flags & 0xe000) {
565
0
                SET_BAD("unknown header flags set");
566
0
                break;
567
0
            }
568
6.11k
            if (state->head != NULL)
569
0
                state->head->text = (int)((hold >> 8) & 1);
570
6.11k
            if ((state->flags & 0x0200) && (state->wrap & 4))
571
0
                CRC2(state->check, hold);
572
6.11k
            INITBITS();
573
6.11k
            state->mode = TIME;
574
6.11k
            Z_FALLTHROUGH;
575
576
6.11k
        case TIME:
577
6.11k
            NEEDBITS(32);
578
6.11k
            if (state->head != NULL)
579
0
                state->head->time = (unsigned)(hold);
580
6.11k
            if ((state->flags & 0x0200) && (state->wrap & 4))
581
0
                CRC4(state->check, hold);
582
6.11k
            INITBITS();
583
6.11k
            state->mode = OS;
584
6.11k
            Z_FALLTHROUGH;
585
586
6.11k
        case OS:
587
6.11k
            NEEDBITS(16);
588
6.11k
            if (state->head != NULL) {
589
0
                state->head->xflags = (int)(hold & 0xff);
590
0
                state->head->os = (int)(hold >> 8);
591
0
            }
592
6.11k
            if ((state->flags & 0x0200) && (state->wrap & 4))
593
0
                CRC2(state->check, hold);
594
6.11k
            INITBITS();
595
6.11k
            state->mode = EXLEN;
596
6.11k
            Z_FALLTHROUGH;
597
598
6.11k
        case EXLEN:
599
6.11k
            if (state->flags & 0x0400) {
600
0
                NEEDBITS(16);
601
0
                state->length = (uint16_t)hold;
602
0
                if (state->head != NULL)
603
0
                    state->head->extra_len = (uint16_t)hold;
604
0
                if ((state->flags & 0x0200) && (state->wrap & 4))
605
0
                    CRC2(state->check, hold);
606
0
                INITBITS();
607
6.11k
            } else if (state->head != NULL) {
608
0
                state->head->extra = NULL;
609
0
            }
610
6.11k
            state->mode = EXTRA;
611
6.11k
            Z_FALLTHROUGH;
612
613
6.11k
        case EXTRA:
614
6.11k
            if (state->flags & 0x0400) {
615
0
                copy = state->length;
616
0
                if (copy > have)
617
0
                    copy = have;
618
0
                if (copy) {
619
0
                    if (state->head != NULL && state->head->extra != NULL) {
620
0
                        len = state->head->extra_len - state->length;
621
0
                        if (len < state->head->extra_max) {
622
0
                            memcpy(state->head->extra + len, next,
623
0
                                    len + copy > state->head->extra_max ?
624
0
                                    state->head->extra_max - len : copy);
625
0
                        }
626
0
                    }
627
0
                    if ((state->flags & 0x0200) && (state->wrap & 4)) {
628
0
                        state->check = PREFIX(crc32)(state->check, next, copy);
629
0
                    }
630
0
                    have -= copy;
631
0
                    next += copy;
632
0
                    state->length -= copy;
633
0
                }
634
0
                if (state->length)
635
0
                    goto inf_leave;
636
0
            }
637
6.11k
            state->length = 0;
638
6.11k
            state->mode = NAME;
639
6.11k
            Z_FALLTHROUGH;
640
641
6.11k
        case NAME:
642
6.11k
            if (state->flags & 0x0800) {
643
0
                if (have == 0) goto inf_leave;
644
0
                copy = 0;
645
0
                do {
646
0
                    len = (unsigned)(next[copy++]);
647
0
                    if (state->head != NULL && state->head->name != NULL && state->length < state->head->name_max)
648
0
                        state->head->name[state->length++] = (unsigned char)len;
649
0
                } while (len && copy < have);
650
0
                if ((state->flags & 0x0200) && (state->wrap & 4))
651
0
                    state->check = PREFIX(crc32)(state->check, next, copy);
652
0
                have -= copy;
653
0
                next += copy;
654
0
                if (len)
655
0
                    goto inf_leave;
656
6.11k
            } else if (state->head != NULL) {
657
0
                state->head->name = NULL;
658
0
            }
659
6.11k
            state->length = 0;
660
6.11k
            state->mode = COMMENT;
661
6.11k
            Z_FALLTHROUGH;
662
663
6.11k
        case COMMENT:
664
6.11k
            if (state->flags & 0x1000) {
665
0
                if (have == 0) goto inf_leave;
666
0
                copy = 0;
667
0
                do {
668
0
                    len = (unsigned)(next[copy++]);
669
0
                    if (state->head != NULL && state->head->comment != NULL
670
0
                        && state->length < state->head->comm_max)
671
0
                        state->head->comment[state->length++] = (unsigned char)len;
672
0
                } while (len && copy < have);
673
0
                if ((state->flags & 0x0200) && (state->wrap & 4))
674
0
                    state->check = PREFIX(crc32)(state->check, next, copy);
675
0
                have -= copy;
676
0
                next += copy;
677
0
                if (len)
678
0
                    goto inf_leave;
679
6.11k
            } else if (state->head != NULL) {
680
0
                state->head->comment = NULL;
681
0
            }
682
6.11k
            state->mode = HCRC;
683
6.11k
            Z_FALLTHROUGH;
684
685
6.11k
        case HCRC:
686
6.11k
            if (state->flags & 0x0200) {
687
0
                NEEDBITS(16);
688
0
                if ((state->wrap & 4) && hold != (state->check & 0xffff)) {
689
0
                    SET_BAD("header crc mismatch");
690
0
                    break;
691
0
                }
692
0
                INITBITS();
693
0
            }
694
6.11k
            if (state->head != NULL) {
695
0
                state->head->hcrc = (int)((state->flags >> 9) & 1);
696
0
                state->head->done = 1;
697
0
            }
698
            /* compute crc32 checksum if not in raw mode */
699
6.11k
            if ((state->wrap & 4) && state->flags)
700
6.11k
                strm->adler = state->check = FUNCTABLE_CALL(crc32_fold_reset)(&state->crc_fold);
701
6.11k
            state->mode = TYPE;
702
6.11k
            break;
703
0
#endif
704
10.0k
        case DICTID:
705
10.0k
            NEEDBITS(32);
706
10.0k
            strm->adler = state->check = ZSWAP32((unsigned)hold);
707
10.0k
            INITBITS();
708
10.0k
            state->mode = DICT;
709
10.0k
            Z_FALLTHROUGH;
710
711
20.1k
        case DICT:
712
20.1k
            if (state->havedict == 0) {
713
10.0k
                RESTORE();
714
10.0k
                return Z_NEED_DICT;
715
10.0k
            }
716
10.0k
            strm->adler = state->check = ADLER32_INITIAL_VALUE;
717
10.0k
            state->mode = TYPE;
718
10.0k
            Z_FALLTHROUGH;
719
720
6.18M
        case TYPE:
721
6.18M
            if (flush == Z_BLOCK || flush == Z_TREES)
722
0
                goto inf_leave;
723
6.18M
            Z_FALLTHROUGH;
724
725
6.19M
        case TYPEDO:
726
            /* determine and dispatch block type */
727
6.19M
            INFLATE_TYPEDO_HOOK(strm, flush);  /* hook for IBM Z DFLTCC */
728
6.19M
            if (state->last) {
729
39.5k
                BYTEBITS();
730
39.5k
                state->mode = CHECK;
731
39.5k
                break;
732
39.5k
            }
733
6.15M
            NEEDBITS(3);
734
6.14M
            state->last = BITS(1);
735
6.14M
            DROPBITS(1);
736
6.14M
            switch (BITS(2)) {
737
23.0k
            case 0:                             /* stored block */
738
23.0k
                Tracev((stderr, "inflate:     stored block%s\n", state->last ? " (last)" : ""));
739
23.0k
                state->mode = STORED;
740
23.0k
                break;
741
6.04M
            case 1:                             /* fixed block */
742
6.04M
                PREFIX(fixedtables)(state);
743
6.04M
                Tracev((stderr, "inflate:     fixed codes block%s\n", state->last ? " (last)" : ""));
744
6.04M
                state->mode = LEN_;             /* decode codes */
745
6.04M
                if (flush == Z_TREES) {
746
0
                    DROPBITS(2);
747
0
                    goto inf_leave;
748
0
                }
749
6.04M
                break;
750
6.04M
            case 2:                             /* dynamic block */
751
79.5k
                Tracev((stderr, "inflate:     dynamic codes block%s\n", state->last ? " (last)" : ""));
752
79.5k
                state->mode = TABLE;
753
79.5k
                break;
754
526
            case 3:
755
526
                SET_BAD("invalid block type");
756
6.14M
            }
757
6.14M
            DROPBITS(2);
758
6.14M
            break;
759
760
26.6k
        case STORED:
761
            /* get and verify stored block length */
762
26.6k
            BYTEBITS();                         /* go to byte boundary */
763
26.6k
            NEEDBITS(32);
764
23.0k
            if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) {
765
838
                SET_BAD("invalid stored block lengths");
766
838
                break;
767
838
            }
768
22.2k
            state->length = (uint16_t)hold;
769
22.2k
            Tracev((stderr, "inflate:       stored length %u\n", state->length));
770
22.2k
            INITBITS();
771
22.2k
            state->mode = COPY_;
772
22.2k
            if (flush == Z_TREES)
773
0
                goto inf_leave;
774
22.2k
            Z_FALLTHROUGH;
775
776
22.2k
        case COPY_:
777
22.2k
            state->mode = COPY;
778
22.2k
            Z_FALLTHROUGH;
779
780
23.2M
        case COPY:
781
            /* copy stored block from input to output */
782
23.2M
            copy = state->length;
783
23.2M
            if (copy) {
784
23.2M
                copy = MIN(copy, have);
785
23.2M
                copy = MIN(copy, left);
786
23.2M
                if (copy == 0)
787
11.5M
                    goto inf_leave;
788
11.6M
                memcpy(put, next, copy);
789
11.6M
                have -= copy;
790
11.6M
                next += copy;
791
11.6M
                left -= copy;
792
11.6M
                put += copy;
793
11.6M
                state->length -= copy;
794
11.6M
                break;
795
23.2M
            }
796
22.0k
            Tracev((stderr, "inflate:       stored end\n"));
797
22.0k
            state->mode = TYPE;
798
22.0k
            break;
799
800
91.1k
        case TABLE:
801
            /* get dynamic table entries descriptor */
802
91.1k
            NEEDBITS(14);
803
79.5k
            state->nlen = BITS(5) + 257;
804
79.5k
            DROPBITS(5);
805
79.5k
            state->ndist = BITS(5) + 1;
806
79.5k
            DROPBITS(5);
807
79.5k
            state->ncode = BITS(4) + 4;
808
79.5k
            DROPBITS(4);
809
79.5k
#ifndef PKZIP_BUG_WORKAROUND
810
79.5k
            if (state->nlen > 286 || state->ndist > 30) {
811
55
                SET_BAD("too many length or distance symbols");
812
55
                break;
813
55
            }
814
79.5k
#endif
815
79.5k
            Tracev((stderr, "inflate:       table sizes ok\n"));
816
79.5k
            state->have = 0;
817
79.5k
            state->mode = LENLENS;
818
79.5k
            Z_FALLTHROUGH;
819
820
119k
        case LENLENS:
821
            /* get code length code lengths (not a typo) */
822
1.50M
            while (state->have < state->ncode) {
823
1.42M
                NEEDBITS(3);
824
1.38M
                state->lens[order[state->have++]] = (uint16_t)BITS(3);
825
1.38M
                DROPBITS(3);
826
1.38M
            }
827
204k
            while (state->have < 19)
828
125k
                state->lens[order[state->have++]] = 0;
829
79.4k
            state->next = state->codes;
830
79.4k
            state->lencode = (const code *)(state->next);
831
79.4k
            state->lenbits = 7;
832
79.4k
            ret = zng_inflate_table(CODES, state->lens, 19, &(state->next), &(state->lenbits), state->work);
833
79.4k
            if (ret) {
834
385
                SET_BAD("invalid code lengths set");
835
385
                break;
836
385
            }
837
79.1k
            Tracev((stderr, "inflate:       code lengths ok\n"));
838
79.1k
            state->have = 0;
839
79.1k
            state->mode = CODELENS;
840
79.1k
            Z_FALLTHROUGH;
841
842
476k
        case CODELENS:
843
            /* get length and distance code code lengths */
844
8.18M
            while (state->have < state->nlen + state->ndist) {
845
10.7M
                for (;;) {
846
10.7M
                    here = state->lencode[BITS(state->lenbits)];
847
10.7M
                    if (here.bits <= bits) break;
848
3.03M
                    PULLBYTE();
849
3.03M
                }
850
7.76M
                if (here.val < 16) {
851
6.37M
                    DROPBITS(here.bits);
852
6.37M
                    state->lens[state->have++] = here.val;
853
6.37M
                } else {
854
1.38M
                    if (here.val == 16) {
855
800k
                        NEEDBITS(here.bits + 2);
856
767k
                        DROPBITS(here.bits);
857
767k
                        if (state->have == 0) {
858
6
                            SET_BAD("invalid bit length repeat");
859
6
                            break;
860
6
                        }
861
767k
                        len = state->lens[state->have - 1];
862
767k
                        copy = 3 + BITS(2);
863
767k
                        DROPBITS(2);
864
767k
                    } else if (here.val == 17) {
865
351k
                        NEEDBITS(here.bits + 3);
866
343k
                        DROPBITS(here.bits);
867
343k
                        len = 0;
868
343k
                        copy = 3 + BITS(3);
869
343k
                        DROPBITS(3);
870
343k
                    } else {
871
231k
                        NEEDBITS(here.bits + 7);
872
222k
                        DROPBITS(here.bits);
873
222k
                        len = 0;
874
222k
                        copy = 11 + BITS(7);
875
222k
                        DROPBITS(7);
876
222k
                    }
877
1.33M
                    if (state->have + copy > state->nlen + state->ndist) {
878
71
                        SET_BAD("invalid bit length repeat");
879
71
                        break;
880
71
                    }
881
17.1M
                    while (copy) {
882
15.8M
                        --copy;
883
15.8M
                        state->lens[state->have++] = (uint16_t)len;
884
15.8M
                    }
885
1.33M
                }
886
7.76M
            }
887
888
            /* handle error breaks in while */
889
78.9k
            if (state->mode == BAD)
890
77
                break;
891
892
            /* check for end-of-block code (better have one) */
893
78.8k
            if (state->lens[256] == 0) {
894
39
                SET_BAD("invalid code -- missing end-of-block");
895
39
                break;
896
39
            }
897
898
            /* build code tables -- note: do not change the lenbits or distbits
899
               values here (10 and 9) without reading the comments in inftrees.h
900
               concerning the ENOUGH constants, which depend on those values */
901
78.8k
            state->next = state->codes;
902
78.8k
            state->lencode = (const code *)(state->next);
903
78.8k
            state->lenbits = 10;
904
78.8k
            ret = zng_inflate_table(LENS, state->lens, state->nlen, &(state->next), &(state->lenbits), state->work);
905
78.8k
            if (ret) {
906
106
                SET_BAD("invalid literal/lengths set");
907
106
                break;
908
106
            }
909
78.7k
            state->distcode = (const code *)(state->next);
910
78.7k
            state->distbits = 9;
911
78.7k
            ret = zng_inflate_table(DISTS, state->lens + state->nlen, state->ndist,
912
78.7k
                            &(state->next), &(state->distbits), state->work);
913
78.7k
            if (ret) {
914
63
                SET_BAD("invalid distances set");
915
63
                break;
916
63
            }
917
78.6k
            Tracev((stderr, "inflate:       codes ok\n"));
918
78.6k
            state->mode = LEN_;
919
78.6k
            if (flush == Z_TREES)
920
0
                goto inf_leave;
921
78.6k
            Z_FALLTHROUGH;
922
923
6.11M
        case LEN_:
924
6.11M
            state->mode = LEN;
925
6.11M
            Z_FALLTHROUGH;
926
927
133M
        case LEN:
928
            /* use inflate_fast() if we have enough input and output */
929
133M
            if (have >= INFLATE_FAST_MIN_HAVE && left >= INFLATE_FAST_MIN_LEFT) {
930
6.10M
                RESTORE();
931
6.10M
                FUNCTABLE_CALL(inflate_fast)(strm, out);
932
6.10M
                LOAD();
933
6.10M
                if (state->mode == TYPE)
934
6.07M
                    state->back = -1;
935
6.10M
                break;
936
6.10M
            }
937
127M
            state->back = 0;
938
939
            /* get a literal, length, or end-of-block code */
940
211M
            for (;;) {
941
211M
                here = state->lencode[BITS(state->lenbits)];
942
211M
                if (here.bits <= bits)
943
93.3M
                    break;
944
118M
                PULLBYTE();
945
118M
            }
946
93.3M
            if (here.op && (here.op & 0xf0) == 0) {
947
452k
                last = here;
948
533k
                for (;;) {
949
533k
                    here = state->lencode[last.val + (BITS(last.bits + last.op) >> last.bits)];
950
533k
                    if ((unsigned)last.bits + (unsigned)here.bits <= bits)
951
376k
                        break;
952
157k
                    PULLBYTE();
953
157k
                }
954
376k
                DROPBITS(last.bits);
955
376k
                state->back += last.bits;
956
376k
            }
957
93.3M
            DROPBITS(here.bits);
958
93.3M
            state->back += here.bits;
959
93.3M
            state->length = here.val;
960
961
            /* process literal */
962
93.3M
            if ((int)(here.op) == 0) {
963
90.3M
                Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?
964
90.3M
                        "inflate:         literal '%c'\n" :
965
90.3M
                        "inflate:         literal 0x%02x\n", here.val));
966
90.3M
                state->mode = LIT;
967
90.3M
                break;
968
90.3M
            }
969
970
            /* process end of block */
971
2.96M
            if (here.op & 32) {
972
46.3k
                Tracevv((stderr, "inflate:         end of block\n"));
973
46.3k
                state->back = -1;
974
46.3k
                state->mode = TYPE;
975
46.3k
                break;
976
46.3k
            }
977
978
            /* invalid code */
979
2.91M
            if (here.op & 64) {
980
10
                SET_BAD("invalid literal/length code");
981
10
                break;
982
10
            }
983
984
            /* length code */
985
2.91M
            state->extra = (here.op & MAX_BITS);
986
2.91M
            state->mode = LENEXT;
987
2.91M
            Z_FALLTHROUGH;
988
989
2.97M
        case LENEXT:
990
            /* get extra bits, if any */
991
2.97M
            if (state->extra) {
992
612k
                NEEDBITS(state->extra);
993
554k
                state->length += BITS(state->extra);
994
554k
                DROPBITS(state->extra);
995
554k
                state->back += state->extra;
996
554k
            }
997
2.91M
            Tracevv((stderr, "inflate:         length %u\n", state->length));
998
2.91M
            state->was = state->length;
999
2.91M
            state->mode = DIST;
1000
2.91M
            Z_FALLTHROUGH;
1001
1002
3.50M
        case DIST:
1003
            /* get distance code */
1004
4.93M
            for (;;) {
1005
4.93M
                here = state->distcode[BITS(state->distbits)];
1006
4.93M
                if (here.bits <= bits)
1007
2.91M
                    break;
1008
2.01M
                PULLBYTE();
1009
2.01M
            }
1010
2.91M
            if ((here.op & 0xf0) == 0) {
1011
6.04k
                last = here;
1012
7.13k
                for (;;) {
1013
7.13k
                    here = state->distcode[last.val + (BITS(last.bits + last.op) >> last.bits)];
1014
7.13k
                    if ((unsigned)last.bits + (unsigned)here.bits <= bits)
1015
5.19k
                        break;
1016
1.93k
                    PULLBYTE();
1017
1.93k
                }
1018
5.19k
                DROPBITS(last.bits);
1019
5.19k
                state->back += last.bits;
1020
5.19k
            }
1021
2.91M
            DROPBITS(here.bits);
1022
2.91M
            state->back += here.bits;
1023
2.91M
            if (here.op & 64) {
1024
22
                SET_BAD("invalid distance code");
1025
22
                break;
1026
22
            }
1027
2.91M
            state->offset = here.val;
1028
2.91M
            state->extra = (here.op & MAX_BITS);
1029
2.91M
            state->mode = DISTEXT;
1030
2.91M
            Z_FALLTHROUGH;
1031
1032
5.83M
        case DISTEXT:
1033
            /* get distance extra bits, if any */
1034
5.83M
            if (state->extra) {
1035
5.73M
                NEEDBITS(state->extra);
1036
2.80M
                state->offset += BITS(state->extra);
1037
2.80M
                DROPBITS(state->extra);
1038
2.80M
                state->back += state->extra;
1039
2.80M
            }
1040
#ifdef INFLATE_STRICT
1041
            if (state->offset > state->dmax) {
1042
                SET_BAD("invalid distance too far back");
1043
                break;
1044
            }
1045
#endif
1046
2.91M
            Tracevv((stderr, "inflate:         distance %u\n", state->offset));
1047
2.91M
            state->mode = MATCH;
1048
2.91M
            Z_FALLTHROUGH;
1049
1050
89.9M
        case MATCH:
1051
            /* copy match from window to output */
1052
89.9M
            if (left == 0)
1053
43.6M
                goto inf_leave;
1054
46.3M
            copy = out - left;
1055
46.3M
            if (state->offset > copy) {         /* copy from window */
1056
46.1M
                copy = state->offset - copy;
1057
46.1M
                if (copy > state->whave) {
1058
#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR
1059
                    if (state->sane) {
1060
                        SET_BAD("invalid distance too far back");
1061
                        break;
1062
                    }
1063
                    Trace((stderr, "inflate.c too far\n"));
1064
                    copy -= state->whave;
1065
                    copy = MIN(copy, state->length);
1066
                    copy = MIN(copy, left);
1067
                    left -= copy;
1068
                    state->length -= copy;
1069
                    do {
1070
                        *put++ = 0;
1071
                    } while (--copy);
1072
                    if (state->length == 0)
1073
                        state->mode = LEN;
1074
#else
1075
237
                    SET_BAD("invalid distance too far back");
1076
237
#endif
1077
237
                    break;
1078
237
                }
1079
46.1M
                if (copy > state->wnext) {
1080
9.80M
                    copy -= state->wnext;
1081
9.80M
                    from = state->window + (state->wsize - copy);
1082
36.3M
                } else {
1083
36.3M
                    from = state->window + (state->wnext - copy);
1084
36.3M
                }
1085
46.1M
                copy = MIN(copy, state->length);
1086
46.1M
                copy = MIN(copy, left);
1087
1088
46.1M
                put = chunkcopy_safe(put, from, copy, put + left);
1089
46.1M
            } else {
1090
155k
                copy = MIN(state->length, left);
1091
1092
155k
                put = FUNCTABLE_CALL(chunkmemset_safe)(put, put - state->offset, copy, left);
1093
155k
            }
1094
46.3M
            left -= copy;
1095
46.3M
            state->length -= copy;
1096
46.3M
            if (state->length == 0)
1097
2.91M
                state->mode = LEN;
1098
46.3M
            break;
1099
1100
146M
        case LIT:
1101
146M
            if (left == 0)
1102
55.7M
                goto inf_leave;
1103
90.3M
            *put++ = (unsigned char)(state->length);
1104
90.3M
            left--;
1105
90.3M
            state->mode = LEN;
1106
90.3M
            break;
1107
1108
39.5k
        case CHECK:
1109
39.5k
            if (state->wrap) {
1110
39.5k
                NEEDBITS(32);
1111
37.6k
                out -= left;
1112
37.6k
                strm->total_out += out;
1113
37.6k
                state->total += out;
1114
1115
                /* compute crc32 checksum if not in raw mode */
1116
37.6k
                if (INFLATE_NEED_CHECKSUM(strm) && state->wrap & 4) {
1117
34.6k
                    if (out) {
1118
34.5k
                        inf_chksum(strm, put - out, out);
1119
34.5k
                    }
1120
34.6k
#ifdef GUNZIP
1121
34.6k
                    if (state->flags)
1122
6.11k
                        strm->adler = state->check = FUNCTABLE_CALL(crc32_fold_final)(&state->crc_fold);
1123
34.6k
#endif
1124
34.6k
                }
1125
37.6k
                out = left;
1126
37.6k
                if ((state->wrap & 4) && (
1127
34.6k
#ifdef GUNZIP
1128
34.6k
                     state->flags ? hold :
1129
34.6k
#endif
1130
34.6k
                     ZSWAP32((unsigned)hold)) != state->check) {
1131
338
                    SET_BAD("incorrect data check");
1132
338
                    break;
1133
338
                }
1134
37.3k
                INITBITS();
1135
37.3k
                Tracev((stderr, "inflate:   check matches trailer\n"));
1136
37.3k
            }
1137
37.3k
#ifdef GUNZIP
1138
37.3k
            state->mode = LENGTH;
1139
37.3k
            Z_FALLTHROUGH;
1140
1141
37.3k
        case LENGTH:
1142
37.3k
            if (state->wrap && state->flags) {
1143
6.12k
                NEEDBITS(32);
1144
6.11k
                if ((state->wrap & 4) && hold != (state->total & 0xffffffff)) {
1145
0
                    SET_BAD("incorrect length check");
1146
0
                    break;
1147
0
                }
1148
6.11k
                INITBITS();
1149
6.11k
                Tracev((stderr, "inflate:   length matches trailer\n"));
1150
6.11k
            }
1151
37.3k
#endif
1152
37.3k
            state->mode = DONE;
1153
37.3k
            Z_FALLTHROUGH;
1154
1155
37.3k
        case DONE:
1156
            /* inflate stream terminated properly */
1157
37.3k
            ret = Z_STREAM_END;
1158
37.3k
            goto inf_leave;
1159
1160
3.06k
        case BAD:
1161
3.06k
            ret = Z_DATA_ERROR;
1162
3.06k
            goto inf_leave;
1163
1164
0
        case SYNC:
1165
1166
0
        default:                 /* can't happen, but makes compilers happy */
1167
0
            return Z_STREAM_ERROR;
1168
399M
        }
1169
1170
    /*
1171
       Return from inflate(), updating the total counts and the check value.
1172
       If there was no progress during the inflate() call, return a buffer
1173
       error.  Call updatewindow() to create and/or update the window state.
1174
     */
1175
148M
  inf_leave:
1176
148M
    RESTORE();
1177
148M
    uint32_t check_bytes = out - strm->avail_out;
1178
148M
    if (INFLATE_NEED_UPDATEWINDOW(strm) &&
1179
148M
            (state->wsize || (out != strm->avail_out && state->mode < BAD &&
1180
148M
                 (state->mode < CHECK || flush != Z_FINISH)))) {
1181
        /* update sliding window with respective checksum if not in "raw" mode */
1182
148M
        updatewindow(strm, strm->next_out, check_bytes, state->wrap & 4);
1183
148M
    }
1184
148M
    in -= strm->avail_in;
1185
148M
    out -= strm->avail_out;
1186
148M
    strm->total_in += in;
1187
148M
    strm->total_out += out;
1188
148M
    state->total += out;
1189
1190
148M
    strm->data_type = (int)state->bits + (state->last ? 64 : 0) +
1191
148M
                      (state->mode == TYPE ? 128 : 0) + (state->mode == LEN_ || state->mode == COPY_ ? 256 : 0);
1192
148M
    if (((in == 0 && out == 0) || flush == Z_FINISH) && ret == Z_OK) {
1193
        /* when no sliding window is used, hash the output bytes if no CHECK state */
1194
1.02k
        if (INFLATE_NEED_CHECKSUM(strm) && !state->wsize && flush == Z_FINISH) {
1195
0
            inf_chksum(strm, put - check_bytes, check_bytes);
1196
0
        }
1197
1.02k
        ret = Z_BUF_ERROR;
1198
1.02k
    }
1199
148M
    return ret;
1200
148M
}
1201
1202
43.9k
int32_t Z_EXPORT PREFIX(inflateEnd)(PREFIX3(stream) *strm) {
1203
43.9k
    if (inflateStateCheck(strm))
1204
0
        return Z_STREAM_ERROR;
1205
1206
    /* Free allocated buffers */
1207
43.9k
    free_inflate(strm);
1208
1209
43.9k
    Tracev((stderr, "inflate: end\n"));
1210
43.9k
    return Z_OK;
1211
43.9k
}
1212
1213
0
int32_t Z_EXPORT PREFIX(inflateGetDictionary)(PREFIX3(stream) *strm, uint8_t *dictionary, uint32_t *dictLength) {
1214
0
    struct inflate_state *state;
1215
1216
    /* check state */
1217
0
    if (inflateStateCheck(strm))
1218
0
        return Z_STREAM_ERROR;
1219
0
    state = (struct inflate_state *)strm->state;
1220
1221
0
    INFLATE_GET_DICTIONARY_HOOK(strm, dictionary, dictLength);  /* hook for IBM Z DFLTCC */
1222
1223
    /* copy dictionary */
1224
0
    if (state->whave && dictionary != NULL) {
1225
0
        memcpy(dictionary, state->window + state->wnext, state->whave - state->wnext);
1226
0
        memcpy(dictionary + state->whave - state->wnext, state->window, state->wnext);
1227
0
    }
1228
0
    if (dictLength != NULL)
1229
0
        *dictLength = state->whave;
1230
0
    return Z_OK;
1231
0
}
1232
1233
10.0k
int32_t Z_EXPORT PREFIX(inflateSetDictionary)(PREFIX3(stream) *strm, const uint8_t *dictionary, uint32_t dictLength) {
1234
10.0k
    struct inflate_state *state;
1235
10.0k
    unsigned long dictid;
1236
1237
    /* check state */
1238
10.0k
    if (inflateStateCheck(strm))
1239
0
        return Z_STREAM_ERROR;
1240
10.0k
    state = (struct inflate_state *)strm->state;
1241
10.0k
    if (state->wrap != 0 && state->mode != DICT)
1242
0
        return Z_STREAM_ERROR;
1243
1244
    /* check for correct dictionary identifier */
1245
10.0k
    if (state->mode == DICT) {
1246
10.0k
        dictid = FUNCTABLE_CALL(adler32)(ADLER32_INITIAL_VALUE, dictionary, dictLength);
1247
10.0k
        if (dictid != state->check)
1248
0
            return Z_DATA_ERROR;
1249
10.0k
    }
1250
1251
10.0k
    INFLATE_SET_DICTIONARY_HOOK(strm, dictionary, dictLength);  /* hook for IBM Z DFLTCC */
1252
1253
    /* copy dictionary to window using updatewindow(), which will amend the
1254
       existing dictionary if appropriate */
1255
10.0k
    updatewindow(strm, dictionary + dictLength, dictLength, 0);
1256
1257
10.0k
    state->havedict = 1;
1258
10.0k
    Tracev((stderr, "inflate:   dictionary set\n"));
1259
10.0k
    return Z_OK;
1260
10.0k
}
1261
1262
0
int32_t Z_EXPORT PREFIX(inflateGetHeader)(PREFIX3(stream) *strm, PREFIX(gz_headerp) head) {
1263
0
    struct inflate_state *state;
1264
1265
    /* check state */
1266
0
    if (inflateStateCheck(strm))
1267
0
        return Z_STREAM_ERROR;
1268
0
    state = (struct inflate_state *)strm->state;
1269
0
    if ((state->wrap & 2) == 0)
1270
0
        return Z_STREAM_ERROR;
1271
1272
    /* save header structure */
1273
0
    state->head = head;
1274
0
    head->done = 0;
1275
0
    return Z_OK;
1276
0
}
1277
1278
/*
1279
   Search buf[0..len-1] for the pattern: 0, 0, 0xff, 0xff.  Return when found
1280
   or when out of input.  When called, *have is the number of pattern bytes
1281
   found in order so far, in 0..3.  On return *have is updated to the new
1282
   state.  If on return *have equals four, then the pattern was found and the
1283
   return value is how many bytes were read including the last byte of the
1284
   pattern.  If *have is less than four, then the pattern has not been found
1285
   yet and the return value is len.  In the latter case, syncsearch() can be
1286
   called again with more data and the *have state.  *have is initialized to
1287
   zero for the first call.
1288
 */
1289
5.98k
static uint32_t syncsearch(uint32_t *have, const uint8_t *buf, uint32_t len) {
1290
5.98k
    uint32_t got, next;
1291
1292
5.98k
    got = *have;
1293
5.98k
    next = 0;
1294
32.9k
    while (next < len && got < 4) {
1295
26.9k
        if ((int)(buf[next]) == (got < 2 ? 0 : 0xff))
1296
12.1k
            got++;
1297
14.8k
        else if (buf[next])
1298
10.8k
            got = 0;
1299
4.00k
        else
1300
4.00k
            got = 4 - got;
1301
26.9k
        next++;
1302
26.9k
    }
1303
5.98k
    *have = got;
1304
5.98k
    return next;
1305
5.98k
}
1306
1307
2.99k
int32_t Z_EXPORT PREFIX(inflateSync)(PREFIX3(stream) *strm) {
1308
2.99k
    struct inflate_state *state;
1309
2.99k
    size_t in, out;             /* temporary to save total_in and total_out */
1310
2.99k
    unsigned len;               /* number of bytes to look at or looked at */
1311
2.99k
    int flags;                  /* temporary to save header status */
1312
2.99k
    unsigned char buf[4];       /* to restore bit buffer to byte string */
1313
1314
    /* check parameters */
1315
2.99k
    if (inflateStateCheck(strm))
1316
0
        return Z_STREAM_ERROR;
1317
2.99k
    state = (struct inflate_state *)strm->state;
1318
2.99k
    if (strm->avail_in == 0 && state->bits < 8)
1319
0
        return Z_BUF_ERROR;
1320
1321
    /* if first time, start search in bit buffer */
1322
2.99k
    if (state->mode != SYNC) {
1323
2.99k
        state->mode = SYNC;
1324
2.99k
        state->hold >>= state->bits & 7;
1325
2.99k
        state->bits -= state->bits & 7;
1326
2.99k
        len = 0;
1327
2.99k
        while (state->bits >= 8) {
1328
0
            buf[len++] = (unsigned char)(state->hold);
1329
0
            state->hold >>= 8;
1330
0
            state->bits -= 8;
1331
0
        }
1332
2.99k
        state->have = 0;
1333
2.99k
        syncsearch(&(state->have), buf, len);
1334
2.99k
    }
1335
1336
    /* search available input */
1337
2.99k
    len = syncsearch(&(state->have), strm->next_in, strm->avail_in);
1338
2.99k
    strm->avail_in -= len;
1339
2.99k
    strm->next_in += len;
1340
2.99k
    strm->total_in += len;
1341
1342
    /* return no joy or set up to restart inflate() on a new block */
1343
2.99k
    if (state->have != 4)
1344
0
        return Z_DATA_ERROR;
1345
2.99k
    if (state->flags == -1)
1346
0
        state->wrap = 0;    /* if no header yet, treat as raw */
1347
2.99k
    else
1348
2.99k
        state->wrap &= ~4;  /* no point in computing a check value now */
1349
2.99k
    flags = state->flags;
1350
2.99k
    in = strm->total_in;
1351
2.99k
    out = strm->total_out;
1352
2.99k
    PREFIX(inflateReset)(strm);
1353
2.99k
    strm->total_in = (z_uintmax_t)in; /* Can't use z_size_t here as it will overflow on 64-bit Windows */
1354
2.99k
    strm->total_out = (z_uintmax_t)out;
1355
2.99k
    state->flags = flags;
1356
2.99k
    state->mode = TYPE;
1357
2.99k
    return Z_OK;
1358
2.99k
}
1359
1360
/*
1361
   Returns true if inflate is currently at the end of a block generated by
1362
   Z_SYNC_FLUSH or Z_FULL_FLUSH. This function is used by one PPP
1363
   implementation to provide an additional safety check. PPP uses
1364
   Z_SYNC_FLUSH but removes the length bytes of the resulting empty stored
1365
   block. When decompressing, PPP checks that at the end of input packet,
1366
   inflate is waiting for these length bytes.
1367
 */
1368
0
int32_t Z_EXPORT PREFIX(inflateSyncPoint)(PREFIX3(stream) *strm) {
1369
0
    struct inflate_state *state;
1370
1371
0
    if (inflateStateCheck(strm))
1372
0
        return Z_STREAM_ERROR;
1373
0
    INFLATE_SYNC_POINT_HOOK(strm);
1374
0
    state = (struct inflate_state *)strm->state;
1375
0
    return state->mode == STORED && state->bits == 0;
1376
0
}
1377
1378
0
int32_t Z_EXPORT PREFIX(inflateCopy)(PREFIX3(stream) *dest, PREFIX3(stream) *source) {
1379
0
    struct inflate_state *state;
1380
0
    struct inflate_state *copy;
1381
1382
    /* check input */
1383
0
    if (inflateStateCheck(source) || dest == NULL)
1384
0
        return Z_STREAM_ERROR;
1385
0
    state = (struct inflate_state *)source->state;
1386
1387
    /* copy stream */
1388
0
    memcpy((void *)dest, (void *)source, sizeof(PREFIX3(stream)));
1389
1390
    /* allocate space */
1391
0
    inflate_allocs *alloc_bufs = alloc_inflate(dest);
1392
0
    if (alloc_bufs == NULL)
1393
0
        return Z_MEM_ERROR;
1394
0
    copy = alloc_bufs->state;
1395
1396
    /* copy state */
1397
0
    memcpy(copy, state, sizeof(struct inflate_state));
1398
0
    copy->strm = dest;
1399
0
    if (state->lencode >= state->codes && state->lencode <= state->codes + ENOUGH - 1) {
1400
0
        copy->lencode = copy->codes + (state->lencode - state->codes);
1401
0
        copy->distcode = copy->codes + (state->distcode - state->codes);
1402
0
    }
1403
0
    copy->next = copy->codes + (state->next - state->codes);
1404
0
    copy->window = alloc_bufs->window;
1405
0
    copy->alloc_bufs = alloc_bufs;
1406
1407
    /* window */
1408
0
    memcpy(copy->window, state->window, INFLATE_ADJUST_WINDOW_SIZE((size_t)state->wsize));
1409
1410
0
    dest->state = (struct internal_state *)copy;
1411
0
    return Z_OK;
1412
0
}
1413
1414
0
int32_t Z_EXPORT PREFIX(inflateUndermine)(PREFIX3(stream) *strm, int32_t subvert) {
1415
#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR
1416
    struct inflate_state *state;
1417
1418
    if (inflateStateCheck(strm))
1419
        return Z_STREAM_ERROR;
1420
    state = (struct inflate_state *)strm->state;
1421
    state->sane = !subvert;
1422
    return Z_OK;
1423
#else
1424
0
    Z_UNUSED(strm);
1425
0
    Z_UNUSED(subvert);
1426
0
    return Z_DATA_ERROR;
1427
0
#endif
1428
0
}
1429
1430
0
int32_t Z_EXPORT PREFIX(inflateValidate)(PREFIX3(stream) *strm, int32_t check) {
1431
0
    struct inflate_state *state;
1432
1433
0
    if (inflateStateCheck(strm))
1434
0
        return Z_STREAM_ERROR;
1435
0
    state = (struct inflate_state *)strm->state;
1436
0
    if (check && state->wrap)
1437
0
        state->wrap |= 4;
1438
0
    else
1439
0
        state->wrap &= ~4;
1440
0
    return Z_OK;
1441
0
}
1442
1443
0
long Z_EXPORT PREFIX(inflateMark)(PREFIX3(stream) *strm) {
1444
0
    struct inflate_state *state;
1445
1446
0
    if (inflateStateCheck(strm))
1447
0
        return -65536;
1448
0
    INFLATE_MARK_HOOK(strm);  /* hook for IBM Z DFLTCC */
1449
0
    state = (struct inflate_state *)strm->state;
1450
0
    return (long)(((unsigned long)((long)state->back)) << 16) +
1451
0
        (state->mode == COPY ? state->length :
1452
0
            (state->mode == MATCH ? state->was - state->length : 0));
1453
0
}
1454
1455
0
unsigned long Z_EXPORT PREFIX(inflateCodesUsed)(PREFIX3(stream) *strm) {
1456
0
    struct inflate_state *state;
1457
0
    if (strm == NULL || strm->state == NULL)
1458
0
        return (unsigned long)-1;
1459
0
    state = (struct inflate_state *)strm->state;
1460
0
    return (unsigned long)(state->next - state->codes);
1461
0
}