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