Subversion Repositories spk

Rev

Rev 1 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1 cycrow 1
/* infback.c -- inflate using a call-back interface
2
 * Copyright (C) 1995-2009 Mark Adler
3
 * For conditions of distribution and use, see copyright notice in zlib.h
4
 */
5
 
6
/*
7
   This code is largely copied from inflate.c.  Normally either infback.o or
8
   inflate.o would be linked into an application--not both.  The interface
9
   with inffast.c is retained so that optimized assembler-coded versions of
10
   inflate_fast() can be used with either inflate.c or infback.c.
11
 */
12
 
13
#include "zutil.h"
14
#include "inftrees.h"
15
#include "inflate.h"
16
#include "inffast.h"
17
 
18
/* function prototypes */
19
local void fixedtables OF((struct inflate_state FAR *state));
20
 
21
/*
22
   strm provides memory allocation functions in zalloc and zfree, or
23
   Z_NULL to use the library memory allocation functions.
24
 
25
   windowBits is in the range 8..15, and window is a user-supplied
26
   window and output buffer that is 2**windowBits bytes.
27
 */
28
int ZEXPORT inflateBackInit_(strm, windowBits, window, version, stream_size)
29
z_streamp strm;
30
int windowBits;
31
unsigned char FAR *window;
32
const char *version;
33
int stream_size;
34
{
35
    struct inflate_state FAR *state;
36
 
37
    if (version == Z_NULL || version[0] != ZLIB_VERSION[0] ||
38
        stream_size != (int)(sizeof(z_stream)))
39
        return Z_VERSION_ERROR;
40
    if (strm == Z_NULL || window == Z_NULL ||
41
        windowBits < 8 || windowBits > 15)
42
        return Z_STREAM_ERROR;
43
    strm->msg = Z_NULL;                 /* in case we return an error */
44
    if (strm->zalloc == (alloc_func)0) {
45
        strm->zalloc = zcalloc;
46
        strm->opaque = (voidpf)0;
47
    }
48
    if (strm->zfree == (free_func)0) strm->zfree = zcfree;
49
    state = (struct inflate_state FAR *)ZALLOC(strm, 1,
50
                                               sizeof(struct inflate_state));
51
    if (state == Z_NULL) return Z_MEM_ERROR;
52
    Tracev((stderr, "inflate: allocated\n"));
53
    strm->state = (struct internal_state FAR *)state;
54
    state->dmax = 32768U;
55
    state->wbits = windowBits;
56
    state->wsize = 1U << windowBits;
57
    state->window = window;
58
    state->wnext = 0;
59
    state->whave = 0;
60
    return Z_OK;
61
}
62
 
63
/*
64
   Return state with length and distance decoding tables and index sizes set to
65
   fixed code decoding.  Normally this returns fixed tables from inffixed.h.
66
   If BUILDFIXED is defined, then instead this routine builds the tables the
67
   first time it's called, and returns those tables the first time and
68
   thereafter.  This reduces the size of the code by about 2K bytes, in
69
   exchange for a little execution time.  However, BUILDFIXED should not be
70
   used for threaded applications, since the rewriting of the tables and virgin
71
   may not be thread-safe.
72
 */
73
local void fixedtables(state)
74
struct inflate_state FAR *state;
75
{
76
#ifdef BUILDFIXED
77
    static int virgin = 1;
78
    static code *lenfix, *distfix;
79
    static code fixed[544];
80
 
81
    /* build fixed huffman tables if first call (may not be thread safe) */
82
    if (virgin) {
83
        unsigned sym, bits;
84
        static code *next;
85
 
86
        /* literal/length table */
87
        sym = 0;
88
        while (sym < 144) state->lens[sym++] = 8;
89
        while (sym < 256) state->lens[sym++] = 9;
90
        while (sym < 280) state->lens[sym++] = 7;
91
        while (sym < 288) state->lens[sym++] = 8;
92
        next = fixed;
93
        lenfix = next;
94
        bits = 9;
95
        inflate_table(LENS, state->lens, 288, &(next), &(bits), state->work);
96
 
97
        /* distance table */
98
        sym = 0;
99
        while (sym < 32) state->lens[sym++] = 5;
100
        distfix = next;
101
        bits = 5;
102
        inflate_table(DISTS, state->lens, 32, &(next), &(bits), state->work);
103
 
104
        /* do this just once */
105
        virgin = 0;
106
    }
107
#else /* !BUILDFIXED */
108
#   include "inffixed.h"
109
#endif /* BUILDFIXED */
110
    state->lencode = lenfix;
111
    state->lenbits = 9;
112
    state->distcode = distfix;
113
    state->distbits = 5;
114
}
115
 
116
/* Macros for inflateBack(): */
117
 
118
/* Load returned state from inflate_fast() */
119
#define LOAD() \
120
    do { \
121
        put = strm->next_out; \
122
        left = strm->avail_out; \
123
        next = strm->next_in; \
124
        have = strm->avail_in; \
125
        hold = state->hold; \
126
        bits = state->bits; \
127
    } while (0)
128
 
129
/* Set state from registers for inflate_fast() */
130
#define RESTORE() \
131
    do { \
132
        strm->next_out = put; \
133
        strm->avail_out = left; \
134
        strm->next_in = next; \
135
        strm->avail_in = have; \
136
        state->hold = hold; \
137
        state->bits = bits; \
138
    } while (0)
139
 
140
/* Clear the input bit accumulator */
141
#define INITBITS() \
142
    do { \
143
        hold = 0; \
144
        bits = 0; \
145
    } while (0)
146
 
147
/* Assure that some input is available.  If input is requested, but denied,
148
   then return a Z_BUF_ERROR from inflateBack(). */
149
#define PULL() \
150
    do { \
151
        if (have == 0) { \
152
            have = in(in_desc, &next); \
153
            if (have == 0) { \
154
                next = Z_NULL; \
155
                ret = Z_BUF_ERROR; \
156
                goto inf_leave; \
157
            } \
158
        } \
159
    } while (0)
160
 
161
/* Get a byte of input into the bit accumulator, or return from inflateBack()
162
   with an error if there is no input available. */
163
#define PULLBYTE() \
164
    do { \
165
        PULL(); \
166
        have--; \
167
        hold += (unsigned long)(*next++) << bits; \
168
        bits += 8; \
169
    } while (0)
170
 
171
/* Assure that there are at least n bits in the bit accumulator.  If there is
172
   not enough available input to do that, then return from inflateBack() with
173
   an error. */
174
#define NEEDBITS(n) \
175
    do { \
176
        while (bits < (unsigned)(n)) \
177
            PULLBYTE(); \
178
    } while (0)
179
 
180
/* Return the low n bits of the bit accumulator (n < 16) */
181
#define BITS(n) \
182
    ((unsigned)hold & ((1U << (n)) - 1))
183
 
184
/* Remove n bits from the bit accumulator */
185
#define DROPBITS(n) \
186
    do { \
187
        hold >>= (n); \
188
        bits -= (unsigned)(n); \
189
    } while (0)
190
 
191
/* Remove zero to seven bits as needed to go to a byte boundary */
192
#define BYTEBITS() \
193
    do { \
194
        hold >>= bits & 7; \
195
        bits -= bits & 7; \
196
    } while (0)
197
 
198
/* Assure that some output space is available, by writing out the window
199
   if it's full.  If the write fails, return from inflateBack() with a
200
   Z_BUF_ERROR. */
201
#define ROOM() \
202
    do { \
203
        if (left == 0) { \
204
            put = state->window; \
205
            left = state->wsize; \
206
            state->whave = left; \
207
            if (out(out_desc, put, left)) { \
208
                ret = Z_BUF_ERROR; \
209
                goto inf_leave; \
210
            } \
211
        } \
212
    } while (0)
213
 
214
/*
215
   strm provides the memory allocation functions and window buffer on input,
216
   and provides information on the unused input on return.  For Z_DATA_ERROR
217
   returns, strm will also provide an error message.
218
 
219
   in() and out() are the call-back input and output functions.  When
220
   inflateBack() needs more input, it calls in().  When inflateBack() has
221
   filled the window with output, or when it completes with data in the
222
   window, it calls out() to write out the data.  The application must not
223
   change the provided input until in() is called again or inflateBack()
224
   returns.  The application must not change the window/output buffer until
225
   inflateBack() returns.
226
 
227
   in() and out() are called with a descriptor parameter provided in the
228
   inflateBack() call.  This parameter can be a structure that provides the
229
   information required to do the read or write, as well as accumulated
230
   information on the input and output such as totals and check values.
231
 
232
   in() should return zero on failure.  out() should return non-zero on
233
   failure.  If either in() or out() fails, than inflateBack() returns a
234
   Z_BUF_ERROR.  strm->next_in can be checked for Z_NULL to see whether it
235
   was in() or out() that caused in the error.  Otherwise,  inflateBack()
236
   returns Z_STREAM_END on success, Z_DATA_ERROR for an deflate format
237
   error, or Z_MEM_ERROR if it could not allocate memory for the state.
238
   inflateBack() can also return Z_STREAM_ERROR if the input parameters
239
   are not correct, i.e. strm is Z_NULL or the state was not initialized.
240
 */
241
int ZEXPORT inflateBack(strm, in, in_desc, out, out_desc)
242
z_streamp strm;
243
in_func in;
244
void FAR *in_desc;
245
out_func out;
246
void FAR *out_desc;
247
{
248
    struct inflate_state FAR *state;
249
    unsigned char FAR *next;    /* next input */
250
    unsigned char FAR *put;     /* next output */
251
    unsigned have, left;        /* available input and output */
252
    unsigned long hold;         /* bit buffer */
253
    unsigned bits;              /* bits in bit buffer */
254
    unsigned copy;              /* number of stored or match bytes to copy */
255
    unsigned char FAR *from;    /* where to copy match bytes from */
256
    code here;                  /* current decoding table entry */
257
    code last;                  /* parent table entry */
258
    unsigned len;               /* length to copy for repeats, bits to drop */
259
    int ret;                    /* return code */
260
    static const unsigned short order[19] = /* permutation of code lengths */
261
        {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15};
262
 
263
    /* Check that the strm exists and that the state was initialized */
264
    if (strm == Z_NULL || strm->state == Z_NULL)
265
        return Z_STREAM_ERROR;
266
    state = (struct inflate_state FAR *)strm->state;
267
 
268
    /* Reset the state */
269
    strm->msg = Z_NULL;
270
    state->mode = TYPE;
271
    state->last = 0;
272
    state->whave = 0;
273
    next = strm->next_in;
274
    have = next != Z_NULL ? strm->avail_in : 0;
275
    hold = 0;
276
    bits = 0;
277
    put = state->window;
278
    left = state->wsize;
279
 
280
    /* Inflate until end of block marked as last */
281
    for (;;)
282
        switch (state->mode) {
283
        case TYPE:
284
            /* determine and dispatch block type */
285
            if (state->last) {
286
                BYTEBITS();
287
                state->mode = DONE;
288
                break;
289
            }
290
            NEEDBITS(3);
291
            state->last = BITS(1);
292
            DROPBITS(1);
293
            switch (BITS(2)) {
294
            case 0:                             /* stored block */
295
                Tracev((stderr, "inflate:     stored block%s\n",
296
                        state->last ? " (last)" : ""));
297
                state->mode = STORED;
298
                break;
299
            case 1:                             /* fixed block */
300
                fixedtables(state);
301
                Tracev((stderr, "inflate:     fixed codes block%s\n",
302
                        state->last ? " (last)" : ""));
303
                state->mode = LEN;              /* decode codes */
304
                break;
305
            case 2:                             /* dynamic block */
306
                Tracev((stderr, "inflate:     dynamic codes block%s\n",
307
                        state->last ? " (last)" : ""));
308
                state->mode = TABLE;
309
                break;
310
            case 3:
311
                strm->msg = (char *)"invalid block type";
312
                state->mode = BAD;
313
            }
314
            DROPBITS(2);
315
            break;
316
 
317
        case STORED:
318
            /* get and verify stored block length */
319
            BYTEBITS();                         /* go to byte boundary */
320
            NEEDBITS(32);
321
            if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) {
322
                strm->msg = (char *)"invalid stored block lengths";
323
                state->mode = BAD;
324
                break;
325
            }
326
            state->length = (unsigned)hold & 0xffff;
327
            Tracev((stderr, "inflate:       stored length %u\n",
328
                    state->length));
329
            INITBITS();
330
 
331
            /* copy stored block from input to output */
332
            while (state->length != 0) {
333
                copy = state->length;
334
                PULL();
335
                ROOM();
336
                if (copy > have) copy = have;
337
                if (copy > left) copy = left;
338
                zmemcpy(put, next, copy);
339
                have -= copy;
340
                next += copy;
341
                left -= copy;
342
                put += copy;
343
                state->length -= copy;
344
            }
345
            Tracev((stderr, "inflate:       stored end\n"));
346
            state->mode = TYPE;
347
            break;
348
 
349
        case TABLE:
350
            /* get dynamic table entries descriptor */
351
            NEEDBITS(14);
352
            state->nlen = BITS(5) + 257;
353
            DROPBITS(5);
354
            state->ndist = BITS(5) + 1;
355
            DROPBITS(5);
356
            state->ncode = BITS(4) + 4;
357
            DROPBITS(4);
358
#ifndef PKZIP_BUG_WORKAROUND
359
            if (state->nlen > 286 || state->ndist > 30) {
360
                strm->msg = (char *)"too many length or distance symbols";
361
                state->mode = BAD;
362
                break;
363
            }
364
#endif
365
            Tracev((stderr, "inflate:       table sizes ok\n"));
366
 
367
            /* get code length code lengths (not a typo) */
368
            state->have = 0;
369
            while (state->have < state->ncode) {
370
                NEEDBITS(3);
371
                state->lens[order[state->have++]] = (unsigned short)BITS(3);
372
                DROPBITS(3);
373
            }
374
            while (state->have < 19)
375
                state->lens[order[state->have++]] = 0;
376
            state->next = state->codes;
377
            state->lencode = (code const FAR *)(state->next);
378
            state->lenbits = 7;
379
            ret = inflate_table(CODES, state->lens, 19, &(state->next),
380
                                &(state->lenbits), state->work);
381
            if (ret) {
382
                strm->msg = (char *)"invalid code lengths set";
383
                state->mode = BAD;
384
                break;
385
            }
386
            Tracev((stderr, "inflate:       code lengths ok\n"));
387
 
388
            /* get length and distance code code lengths */
389
            state->have = 0;
390
            while (state->have < state->nlen + state->ndist) {
391
                for (;;) {
392
                    here = state->lencode[BITS(state->lenbits)];
393
                    if ((unsigned)(here.bits) <= bits) break;
394
                    PULLBYTE();
395
                }
396
                if (here.val < 16) {
397
                    NEEDBITS(here.bits);
398
                    DROPBITS(here.bits);
399
                    state->lens[state->have++] = here.val;
400
                }
401
                else {
402
                    if (here.val == 16) {
403
                        NEEDBITS(here.bits + 2);
404
                        DROPBITS(here.bits);
405
                        if (state->have == 0) {
406
                            strm->msg = (char *)"invalid bit length repeat";
407
                            state->mode = BAD;
408
                            break;
409
                        }
410
                        len = (unsigned)(state->lens[state->have - 1]);
411
                        copy = 3 + BITS(2);
412
                        DROPBITS(2);
413
                    }
414
                    else if (here.val == 17) {
415
                        NEEDBITS(here.bits + 3);
416
                        DROPBITS(here.bits);
417
                        len = 0;
418
                        copy = 3 + BITS(3);
419
                        DROPBITS(3);
420
                    }
421
                    else {
422
                        NEEDBITS(here.bits + 7);
423
                        DROPBITS(here.bits);
424
                        len = 0;
425
                        copy = 11 + BITS(7);
426
                        DROPBITS(7);
427
                    }
428
                    if (state->have + copy > state->nlen + state->ndist) {
429
                        strm->msg = (char *)"invalid bit length repeat";
430
                        state->mode = BAD;
431
                        break;
432
                    }
433
                    while (copy--)
434
                        state->lens[state->have++] = (unsigned short)len;
435
                }
436
            }
437
 
438
            /* handle error breaks in while */
439
            if (state->mode == BAD) break;
440
 
441
            /* check for end-of-block code (better have one) */
442
            if (state->lens[256] == 0) {
443
                strm->msg = (char *)"invalid code -- missing end-of-block";
444
                state->mode = BAD;
445
                break;
446
            }
447
 
448
            /* build code tables -- note: do not change the lenbits or distbits
449
               values here (9 and 6) without reading the comments in inftrees.h
450
               concerning the ENOUGH constants, which depend on those values */
451
            state->next = state->codes;
452
            state->lencode = (code const FAR *)(state->next);
453
            state->lenbits = 9;
454
            ret = inflate_table(LENS, state->lens, state->nlen, &(state->next),
455
                                &(state->lenbits), state->work);
456
            if (ret) {
457
                strm->msg = (char *)"invalid literal/lengths set";
458
                state->mode = BAD;
459
                break;
460
            }
461
            state->distcode = (code const FAR *)(state->next);
462
            state->distbits = 6;
463
            ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist,
464
                            &(state->next), &(state->distbits), state->work);
465
            if (ret) {
466
                strm->msg = (char *)"invalid distances set";
467
                state->mode = BAD;
468
                break;
469
            }
470
            Tracev((stderr, "inflate:       codes ok\n"));
471
            state->mode = LEN;
472
 
473
        case LEN:
474
            /* use inflate_fast() if we have enough input and output */
475
            if (have >= 6 && left >= 258) {
476
                RESTORE();
477
                if (state->whave < state->wsize)
478
                    state->whave = state->wsize - left;
479
                inflate_fast(strm, state->wsize);
480
                LOAD();
481
                break;
482
            }
483
 
484
            /* get a literal, length, or end-of-block code */
485
            for (;;) {
486
                here = state->lencode[BITS(state->lenbits)];
487
                if ((unsigned)(here.bits) <= bits) break;
488
                PULLBYTE();
489
            }
490
            if (here.op && (here.op & 0xf0) == 0) {
491
                last = here;
492
                for (;;) {
493
                    here = state->lencode[last.val +
494
                            (BITS(last.bits + last.op) >> last.bits)];
495
                    if ((unsigned)(last.bits + here.bits) <= bits) break;
496
                    PULLBYTE();
497
                }
498
                DROPBITS(last.bits);
499
            }
500
            DROPBITS(here.bits);
501
            state->length = (unsigned)here.val;
502
 
503
            /* process literal */
504
            if (here.op == 0) {
505
                Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?
506
                        "inflate:         literal '%c'\n" :
507
                        "inflate:         literal 0x%02x\n", here.val));
508
                ROOM();
509
                *put++ = (unsigned char)(state->length);
510
                left--;
511
                state->mode = LEN;
512
                break;
513
            }
514
 
515
            /* process end of block */
516
            if (here.op & 32) {
517
                Tracevv((stderr, "inflate:         end of block\n"));
518
                state->mode = TYPE;
519
                break;
520
            }
521
 
522
            /* invalid code */
523
            if (here.op & 64) {
524
                strm->msg = (char *)"invalid literal/length code";
525
                state->mode = BAD;
526
                break;
527
            }
528
 
529
            /* length code -- get extra bits, if any */
530
            state->extra = (unsigned)(here.op) & 15;
531
            if (state->extra != 0) {
532
                NEEDBITS(state->extra);
533
                state->length += BITS(state->extra);
534
                DROPBITS(state->extra);
535
            }
536
            Tracevv((stderr, "inflate:         length %u\n", state->length));
537
 
538
            /* get distance code */
539
            for (;;) {
540
                here = state->distcode[BITS(state->distbits)];
541
                if ((unsigned)(here.bits) <= bits) break;
542
                PULLBYTE();
543
            }
544
            if ((here.op & 0xf0) == 0) {
545
                last = here;
546
                for (;;) {
547
                    here = state->distcode[last.val +
548
                            (BITS(last.bits + last.op) >> last.bits)];
549
                    if ((unsigned)(last.bits + here.bits) <= bits) break;
550
                    PULLBYTE();
551
                }
552
                DROPBITS(last.bits);
553
            }
554
            DROPBITS(here.bits);
555
            if (here.op & 64) {
556
                strm->msg = (char *)"invalid distance code";
557
                state->mode = BAD;
558
                break;
559
            }
560
            state->offset = (unsigned)here.val;
561
 
562
            /* get distance extra bits, if any */
563
            state->extra = (unsigned)(here.op) & 15;
564
            if (state->extra != 0) {
565
                NEEDBITS(state->extra);
566
                state->offset += BITS(state->extra);
567
                DROPBITS(state->extra);
568
            }
569
            if (state->offset > state->wsize - (state->whave < state->wsize ?
570
                                                left : 0)) {
571
                strm->msg = (char *)"invalid distance too far back";
572
                state->mode = BAD;
573
                break;
574
            }
575
            Tracevv((stderr, "inflate:         distance %u\n", state->offset));
576
 
577
            /* copy match from window to output */
578
            do {
579
                ROOM();
580
                copy = state->wsize - state->offset;
581
                if (copy < left) {
582
                    from = put + copy;
583
                    copy = left - copy;
584
                }
585
                else {
586
                    from = put - state->offset;
587
                    copy = left;
588
                }
589
                if (copy > state->length) copy = state->length;
590
                state->length -= copy;
591
                left -= copy;
592
                do {
593
                    *put++ = *from++;
594
                } while (--copy);
595
            } while (state->length != 0);
596
            break;
597
 
598
        case DONE:
599
            /* inflate stream terminated properly -- write leftover output */
600
            ret = Z_STREAM_END;
601
            if (left < state->wsize) {
602
                if (out(out_desc, state->window, state->wsize - left))
603
                    ret = Z_BUF_ERROR;
604
            }
605
            goto inf_leave;
606
 
607
        case BAD:
608
            ret = Z_DATA_ERROR;
609
            goto inf_leave;
610
 
611
        default:                /* can't happen, but makes compilers happy */
612
            ret = Z_STREAM_ERROR;
613
            goto inf_leave;
614
        }
615
 
616
    /* Return unused input */
617
  inf_leave:
618
    strm->next_in = next;
619
    strm->avail_in = have;
620
    return ret;
621
}
622
 
623
int ZEXPORT inflateBackEnd(strm)
624
z_streamp strm;
625
{
626
    if (strm == Z_NULL || strm->state == Z_NULL || strm->zfree == (free_func)0)
627
        return Z_STREAM_ERROR;
628
    ZFREE(strm, strm->state);
629
    strm->state = Z_NULL;
630
    Tracev((stderr, "inflate: end\n"));
631
    return Z_OK;
632
}