Coverage Report

Created: 2026-06-07 06:54

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