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