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