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