Coverage Report

Created: 2026-08-31 06:47

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