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