Magellan Linux

Contents of /trunk/mkinitrd-magellan/busybox/archival/libunarchive/decompress_unzip.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 532 - (show annotations) (download)
Sat Sep 1 22:45:15 2007 UTC (16 years, 8 months ago) by niro
File MIME type: text/plain
File size: 31361 byte(s)
-import if magellan mkinitrd; it is a fork of redhats mkinitrd-5.0.8 with all magellan patches and features; deprecates magellan-src/mkinitrd

1 /* vi: set sw=4 ts=4: */
2 /*
3 * gunzip implementation for busybox
4 *
5 * Based on GNU gzip v1.2.4 Copyright (C) 1992-1993 Jean-loup Gailly.
6 *
7 * Originally adjusted for busybox by Sven Rudolph <sr1@inf.tu-dresden.de>
8 * based on gzip sources
9 *
10 * Adjusted further by Erik Andersen <andersen@codepoet.org> to support
11 * files as well as stdin/stdout, and to generally behave itself wrt
12 * command line handling.
13 *
14 * General cleanup to better adhere to the style guide and make use of standard
15 * busybox functions by Glenn McGrath <bug1@iinet.net.au>
16 *
17 * read_gz interface + associated hacking by Laurence Anderson
18 *
19 * Fixed huft_build() so decoding end-of-block code does not grab more bits
20 * than necessary (this is required by unzip applet), added inflate_cleanup()
21 * to free leaked bytebuffer memory (used in unzip.c), and some minor style
22 * guide cleanups by Ed Clark
23 *
24 * gzip (GNU zip) -- compress files with zip algorithm and 'compress' interface
25 * Copyright (C) 1992-1993 Jean-loup Gailly
26 * The unzip code was written and put in the public domain by Mark Adler.
27 * Portions of the lzw code are derived from the public domain 'compress'
28 * written by Spencer Thomas, Joe Orost, James Woods, Jim McKie, Steve Davies,
29 * Ken Turkowski, Dave Mack and Peter Jannesen.
30 *
31 * See the file algorithm.doc for the compression algorithms and file formats.
32 *
33 * Licensed under GPLv2 or later, see file LICENSE in this tarball for details.
34 */
35
36 #include "libbb.h"
37 #include "unarchive.h"
38
39 typedef struct huft_s {
40 unsigned char e; /* number of extra bits or operation */
41 unsigned char b; /* number of bits in this code or subcode */
42 union {
43 unsigned short n; /* literal, length base, or distance base */
44 struct huft_s *t; /* pointer to next level of table */
45 } v;
46 } huft_t;
47
48 enum {
49 /* gunzip_window size--must be a power of two, and
50 * at least 32K for zip's deflate method */
51 GUNZIP_WSIZE = 0x8000,
52 /* If BMAX needs to be larger than 16, then h and x[] should be ulg. */
53 BMAX = 16, /* maximum bit length of any code (16 for explode) */
54 N_MAX = 288, /* maximum number of codes in any set */
55 };
56
57
58 /* This is somewhat complex-looking arrangement, but it allows
59 * to place decompressor state either in bss or in
60 * malloc'ed space simply by changing #defines below.
61 * Sizes on i386:
62 * text data bss dec hex
63 * 5256 0 108 5364 14f4 - bss
64 * 4915 0 0 4915 1333 - malloc
65 */
66 #define STATE_IN_BSS 0
67 #define STATE_IN_MALLOC 1
68
69
70 typedef struct state_t {
71 off_t gunzip_bytes_out; /* number of output bytes */
72 uint32_t gunzip_crc;
73
74 int gunzip_src_fd;
75 unsigned gunzip_outbuf_count; /* bytes in output buffer */
76
77 unsigned char *gunzip_window;
78
79 uint32_t *gunzip_crc_table;
80
81 /* bitbuffer */
82 unsigned gunzip_bb; /* bit buffer */
83 unsigned char gunzip_bk; /* bits in bit buffer */
84
85 /* These control the size of the STATE()bytebuffer */
86 unsigned bytebuffer_max;
87 unsigned char *bytebuffer;
88 unsigned bytebuffer_offset;
89 unsigned bytebuffer_size;
90
91 /* private data of inflate_codes() */
92 unsigned inflate_codes_ml; /* masks for bl and bd bits */
93 unsigned inflate_codes_md; /* masks for bl and bd bits */
94 unsigned inflate_codes_bb; /* bit buffer */
95 unsigned inflate_codes_k; /* number of bits in bit buffer */
96 unsigned inflate_codes_w; /* current gunzip_window position */
97 huft_t *inflate_codes_tl;
98 huft_t *inflate_codes_td;
99 unsigned inflate_codes_bl;
100 unsigned inflate_codes_bd;
101 unsigned inflate_codes_nn; /* length and index for copy */
102 unsigned inflate_codes_dd;
103 smallint resume_copy;
104
105 /* private data of inflate_get_next_window() */
106 smallint method; /* Method == -1 for stored, -2 for codes */
107 smallint need_another_block;
108 smallint end_reached;
109
110 /* private data of inflate_stored() */
111 unsigned inflate_stored_n;
112 unsigned inflate_stored_b;
113 unsigned inflate_stored_k;
114 unsigned inflate_stored_w;
115 } state_t;
116 #define gunzip_bytes_out (S()gunzip_bytes_out )
117 #define gunzip_crc (S()gunzip_crc )
118 #define gunzip_src_fd (S()gunzip_src_fd )
119 #define gunzip_outbuf_count (S()gunzip_outbuf_count)
120 #define gunzip_window (S()gunzip_window )
121 #define gunzip_crc_table (S()gunzip_crc_table )
122 #define gunzip_bb (S()gunzip_bb )
123 #define gunzip_bk (S()gunzip_bk )
124 #define bytebuffer_max (S()bytebuffer_max )
125 #define bytebuffer (S()bytebuffer )
126 #define bytebuffer_offset (S()bytebuffer_offset )
127 #define bytebuffer_size (S()bytebuffer_size )
128 #define inflate_codes_ml (S()inflate_codes_ml )
129 #define inflate_codes_md (S()inflate_codes_md )
130 #define inflate_codes_bb (S()inflate_codes_bb )
131 #define inflate_codes_k (S()inflate_codes_k )
132 #define inflate_codes_w (S()inflate_codes_w )
133 #define inflate_codes_tl (S()inflate_codes_tl )
134 #define inflate_codes_td (S()inflate_codes_td )
135 #define inflate_codes_bl (S()inflate_codes_bl )
136 #define inflate_codes_bd (S()inflate_codes_bd )
137 #define inflate_codes_nn (S()inflate_codes_nn )
138 #define inflate_codes_dd (S()inflate_codes_dd )
139 #define resume_copy (S()resume_copy )
140 #define method (S()method )
141 #define need_another_block (S()need_another_block )
142 #define end_reached (S()end_reached )
143 #define inflate_stored_n (S()inflate_stored_n )
144 #define inflate_stored_b (S()inflate_stored_b )
145 #define inflate_stored_k (S()inflate_stored_k )
146 #define inflate_stored_w (S()inflate_stored_w )
147 #define INIT_STATE ({ bytebuffer_size = 0; method = -1; need_another_block = 1; })
148
149
150 /* This is generic part */
151 #if STATE_IN_BSS /* Use global data segment */
152 #define DECLARE_STATE /*nothing*/
153 #define ALLOC_STATE (init_state())
154 #define DEALLOC_STATE ((void)0)
155 #define S() state.
156 #define PASS_STATE /*nothing*/
157 #define PASS_STATE_ONLY /*nothing*/
158 #define STATE_PARAM /*nothing*/
159 #define STATE_PARAM_ONLY void
160 static state_t state;
161 static void init_state(void)
162 {
163 INIT_STATE;
164 }
165 #endif
166
167 #if STATE_IN_MALLOC /* Use malloc space */
168 #define DECLARE_STATE state_t *state
169 #define ALLOC_STATE (state = alloc_state())
170 #define DEALLOC_STATE free(state)
171 #define S() state->
172 #define PASS_STATE state,
173 #define PASS_STATE_ONLY state
174 #define STATE_PARAM state_t *state,
175 #define STATE_PARAM_ONLY state_t *state
176 static state_t* alloc_state(void)
177 {
178 state_t* state = xzalloc(sizeof(*state));
179 INIT_STATE;
180 return state;
181 }
182 #endif
183
184
185 static const unsigned short mask_bits[] = {
186 0x0000, 0x0001, 0x0003, 0x0007, 0x000f, 0x001f, 0x003f, 0x007f, 0x00ff,
187 0x01ff, 0x03ff, 0x07ff, 0x0fff, 0x1fff, 0x3fff, 0x7fff, 0xffff
188 };
189
190 /* Copy lengths for literal codes 257..285 */
191 static const unsigned short cplens[] = {
192 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, 35, 43, 51, 59,
193 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0
194 };
195
196 /* note: see note #13 above about the 258 in this list. */
197 /* Extra bits for literal codes 257..285 */
198 static const unsigned char cplext[] = {
199 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5,
200 5, 5, 5, 0, 99, 99
201 }; /* 99 == invalid */
202
203 /* Copy offsets for distance codes 0..29 */
204 static const unsigned short cpdist[] = {
205 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513,
206 769, 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577
207 };
208
209 /* Extra bits for distance codes */
210 static const unsigned char cpdext[] = {
211 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10,
212 11, 11, 12, 12, 13, 13
213 };
214
215 /* Tables for deflate from PKZIP's appnote.txt. */
216 /* Order of the bit length code lengths */
217 static const unsigned char border[] = {
218 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15
219 };
220
221 static unsigned fill_bitbuffer(STATE_PARAM unsigned bitbuffer, unsigned *current, const unsigned required)
222 {
223 while (*current < required) {
224 if (bytebuffer_offset >= bytebuffer_size) {
225 /* Leave the first 4 bytes empty so we can always unwind the bitbuffer
226 * to the front of the bytebuffer, leave 4 bytes free at end of tail
227 * so we can easily top up buffer in check_trailer_gzip() */
228 bytebuffer_size = safe_read(gunzip_src_fd, &bytebuffer[4], bytebuffer_max - 8);
229 if (1 > bytebuffer_size)
230 //shouldn't we propagate error?
231 bb_error_msg_and_die("unexpected end of file");
232 bytebuffer_size += 4;
233 bytebuffer_offset = 4;
234 }
235 bitbuffer |= ((unsigned) bytebuffer[bytebuffer_offset]) << *current;
236 bytebuffer_offset++;
237 *current += 8;
238 }
239 return bitbuffer;
240 }
241
242 /*
243 * Free the malloc'ed tables built by huft_build(), which makes a linked
244 * list of the tables it made, with the links in a dummy first entry of
245 * each table.
246 * t: table to free
247 */
248 static void huft_free(huft_t * p)
249 {
250 huft_t *q;
251
252 /* Go through linked list, freeing from the malloced (t[-1]) address. */
253 while (p) {
254 q = (--p)->v.t;
255 free(p);
256 p = q;
257 }
258 }
259
260 /* Given a list of code lengths and a maximum table size, make a set of
261 * tables to decode that set of codes. Return zero on success, one if
262 * the given code set is incomplete (the tables are still built in this
263 * case), two if the input is invalid (all zero length codes or an
264 * oversubscribed set of lengths), and three if not enough memory.
265 *
266 * b: code lengths in bits (all assumed <= BMAX)
267 * n: number of codes (assumed <= N_MAX)
268 * s: number of simple-valued codes (0..s-1)
269 * d: list of base values for non-simple codes
270 * e: list of extra bits for non-simple codes
271 * t: result: starting table
272 * m: maximum lookup bits, returns actual
273 */
274 static int huft_build(unsigned *b, const unsigned n,
275 const unsigned s, const unsigned short *d,
276 const unsigned char *e, huft_t ** t, unsigned *m)
277 {
278 unsigned a; /* counter for codes of length k */
279 unsigned c[BMAX + 1]; /* bit length count table */
280 unsigned eob_len; /* length of end-of-block code (value 256) */
281 unsigned f; /* i repeats in table every f entries */
282 int g; /* maximum code length */
283 int htl; /* table level */
284 unsigned i; /* counter, current code */
285 unsigned j; /* counter */
286 int k; /* number of bits in current code */
287 unsigned *p; /* pointer into c[], b[], or v[] */
288 huft_t *q; /* points to current table */
289 huft_t r; /* table entry for structure assignment */
290 huft_t *u[BMAX]; /* table stack */
291 unsigned v[N_MAX]; /* values in order of bit length */
292 int ws[BMAX+1]; /* bits decoded stack */
293 int w; /* bits decoded */
294 unsigned x[BMAX + 1]; /* bit offsets, then code stack */
295 unsigned *xp; /* pointer into x */
296 int y; /* number of dummy codes added */
297 unsigned z; /* number of entries in current table */
298
299 /* Length of EOB code, if any */
300 eob_len = n > 256 ? b[256] : BMAX;
301
302 /* Generate counts for each bit length */
303 memset(c, 0, sizeof(c));
304 p = b;
305 i = n;
306 do {
307 c[*p]++; /* assume all entries <= BMAX */
308 p++; /* Can't combine with above line (Solaris bug) */
309 } while (--i);
310 if (c[0] == n) { /* null input--all zero length codes */
311 *t = NULL;
312 *m = 0;
313 return 2;
314 }
315
316 /* Find minimum and maximum length, bound *m by those */
317 for (j = 1; (c[j] == 0) && (j <= BMAX); j++);
318 k = j; /* minimum code length */
319 for (i = BMAX; (c[i] == 0) && i; i--);
320 g = i; /* maximum code length */
321 *m = (*m < j) ? j : ((*m > i) ? i : *m);
322
323 /* Adjust last length count to fill out codes, if needed */
324 for (y = 1 << j; j < i; j++, y <<= 1) {
325 y -= c[j];
326 if (y < 0) {
327 return 2; /* bad input: more codes than bits */
328 }
329 }
330 y -= c[i];
331 if (y < 0) {
332 return 2;
333 }
334 c[i] += y;
335
336 /* Generate starting offsets into the value table for each length */
337 x[1] = j = 0;
338 p = c + 1;
339 xp = x + 2;
340 while (--i) { /* note that i == g from above */
341 j += *p++;
342 *xp++ = j;
343 }
344
345 /* Make a table of values in order of bit lengths */
346 p = b;
347 i = 0;
348 do {
349 j = *p++;
350 if (j != 0) {
351 v[x[j]++] = i;
352 }
353 } while (++i < n);
354
355 /* Generate the Huffman codes and for each, make the table entries */
356 x[0] = i = 0; /* first Huffman code is zero */
357 p = v; /* grab values in bit order */
358 htl = -1; /* no tables yet--level -1 */
359 w = ws[0] = 0; /* bits decoded */
360 u[0] = NULL; /* just to keep compilers happy */
361 q = NULL; /* ditto */
362 z = 0; /* ditto */
363
364 /* go through the bit lengths (k already is bits in shortest code) */
365 for (; k <= g; k++) {
366 a = c[k];
367 while (a--) {
368 /* here i is the Huffman code of length k bits for value *p */
369 /* make tables up to required level */
370 while (k > ws[htl + 1]) {
371 w = ws[++htl];
372
373 /* compute minimum size table less than or equal to *m bits */
374 z = g - w;
375 z = z > *m ? *m : z; /* upper limit on table size */
376 j = k - w;
377 f = 1 << j;
378 if (f > a + 1) { /* try a k-w bit table */
379 /* too few codes for k-w bit table */
380 f -= a + 1; /* deduct codes from patterns left */
381 xp = c + k;
382 while (++j < z) { /* try smaller tables up to z bits */
383 f <<= 1;
384 if (f <= *++xp) {
385 break; /* enough codes to use up j bits */
386 }
387 f -= *xp; /* else deduct codes from patterns */
388 }
389 }
390 j = (w + j > eob_len && w < eob_len) ? eob_len - w : j; /* make EOB code end at table */
391 z = 1 << j; /* table entries for j-bit table */
392 ws[htl+1] = w + j; /* set bits decoded in stack */
393
394 /* allocate and link in new table */
395 q = xzalloc((z + 1) * sizeof(huft_t));
396 *t = q + 1; /* link to list for huft_free() */
397 t = &(q->v.t);
398 u[htl] = ++q; /* table starts after link */
399
400 /* connect to last table, if there is one */
401 if (htl) {
402 x[htl] = i; /* save pattern for backing up */
403 r.b = (unsigned char) (w - ws[htl - 1]); /* bits to dump before this table */
404 r.e = (unsigned char) (16 + j); /* bits in this table */
405 r.v.t = q; /* pointer to this table */
406 j = (i & ((1 << w) - 1)) >> ws[htl - 1];
407 u[htl - 1][j] = r; /* connect to last table */
408 }
409 }
410
411 /* set up table entry in r */
412 r.b = (unsigned char) (k - w);
413 if (p >= v + n) {
414 r.e = 99; /* out of values--invalid code */
415 } else if (*p < s) {
416 r.e = (unsigned char) (*p < 256 ? 16 : 15); /* 256 is EOB code */
417 r.v.n = (unsigned short) (*p++); /* simple code is just the value */
418 } else {
419 r.e = (unsigned char) e[*p - s]; /* non-simple--look up in lists */
420 r.v.n = d[*p++ - s];
421 }
422
423 /* fill code-like entries with r */
424 f = 1 << (k - w);
425 for (j = i >> w; j < z; j += f) {
426 q[j] = r;
427 }
428
429 /* backwards increment the k-bit code i */
430 for (j = 1 << (k - 1); i & j; j >>= 1) {
431 i ^= j;
432 }
433 i ^= j;
434
435 /* backup over finished tables */
436 while ((i & ((1 << w) - 1)) != x[htl]) {
437 w = ws[--htl];
438 }
439 }
440 }
441
442 /* return actual size of base table */
443 *m = ws[1];
444
445 /* Return true (1) if we were given an incomplete table */
446 return y != 0 && g != 1;
447 }
448
449
450 /*
451 * inflate (decompress) the codes in a deflated (compressed) block.
452 * Return an error code or zero if it all goes ok.
453 *
454 * tl, td: literal/length and distance decoder tables
455 * bl, bd: number of bits decoded by tl[] and td[]
456 */
457 /* called once from inflate_block */
458 #define ml inflate_codes_ml
459 #define md inflate_codes_md
460 #define bb inflate_codes_bb
461 #define k inflate_codes_k
462 #define w inflate_codes_w
463 #define tl inflate_codes_tl
464 #define td inflate_codes_td
465 #define bl inflate_codes_bl
466 #define bd inflate_codes_bd
467 #define nn inflate_codes_nn
468 #define dd inflate_codes_dd
469 static void inflate_codes_setup(STATE_PARAM huft_t * my_tl, huft_t * my_td, const unsigned my_bl, const unsigned my_bd)
470 {
471 tl = my_tl;
472 td = my_td;
473 bl = my_bl;
474 bd = my_bd;
475 /* make local copies of globals */
476 bb = gunzip_bb; /* initialize bit buffer */
477 k = gunzip_bk;
478 w = gunzip_outbuf_count; /* initialize gunzip_window position */
479 /* inflate the coded data */
480 ml = mask_bits[bl]; /* precompute masks for speed */
481 md = mask_bits[bd];
482 }
483 /* called once from inflate_get_next_window */
484 static int inflate_codes(STATE_PARAM_ONLY)
485 {
486 unsigned e; /* table entry flag/number of extra bits */
487 huft_t *t; /* pointer to table entry */
488
489 if (resume_copy) goto do_copy;
490
491 while (1) { /* do until end of block */
492 bb = fill_bitbuffer(PASS_STATE bb, &k, bl);
493 t = tl + ((unsigned) bb & ml);
494 e = t->e;
495 if (e > 16)
496 do {
497 if (e == 99) {
498 //shouldn't we propagate error?
499 bb_error_msg_and_die("inflate_codes error 1");
500 }
501 bb >>= t->b;
502 k -= t->b;
503 e -= 16;
504 bb = fill_bitbuffer(PASS_STATE bb, &k, e);
505 t = t->v.t + ((unsigned) bb & mask_bits[e]);
506 e = t->e;
507 } while (e > 16);
508 bb >>= t->b;
509 k -= t->b;
510 if (e == 16) { /* then it's a literal */
511 gunzip_window[w++] = (unsigned char) t->v.n;
512 if (w == GUNZIP_WSIZE) {
513 gunzip_outbuf_count = w;
514 //flush_gunzip_window();
515 w = 0;
516 return 1; // We have a block to read
517 }
518 } else { /* it's an EOB or a length */
519 /* exit if end of block */
520 if (e == 15) {
521 break;
522 }
523
524 /* get length of block to copy */
525 bb = fill_bitbuffer(PASS_STATE bb, &k, e);
526 nn = t->v.n + ((unsigned) bb & mask_bits[e]);
527 bb >>= e;
528 k -= e;
529
530 /* decode distance of block to copy */
531 bb = fill_bitbuffer(PASS_STATE bb, &k, bd);
532 t = td + ((unsigned) bb & md);
533 e = t->e;
534 if (e > 16)
535 do {
536 if (e == 99)
537 //shouldn't we propagate error?
538 bb_error_msg_and_die("inflate_codes error 2");
539 bb >>= t->b;
540 k -= t->b;
541 e -= 16;
542 bb = fill_bitbuffer(PASS_STATE bb, &k, e);
543 t = t->v.t + ((unsigned) bb & mask_bits[e]);
544 e = t->e;
545 } while (e > 16);
546 bb >>= t->b;
547 k -= t->b;
548 bb = fill_bitbuffer(PASS_STATE bb, &k, e);
549 dd = w - t->v.n - ((unsigned) bb & mask_bits[e]);
550 bb >>= e;
551 k -= e;
552
553 /* do the copy */
554 do_copy:
555 do {
556 /* Was: nn -= (e = (e = GUNZIP_WSIZE - ((dd &= GUNZIP_WSIZE - 1) > w ? dd : w)) > nn ? nn : e); */
557 /* Who wrote THAT?? rewritten as: */
558 dd &= GUNZIP_WSIZE - 1;
559 e = GUNZIP_WSIZE - (dd > w ? dd : w);
560 if (e > nn) e = nn;
561 nn -= e;
562
563 /* copy to new buffer to prevent possible overwrite */
564 if (w - dd >= e) { /* (this test assumes unsigned comparison) */
565 memcpy(gunzip_window + w, gunzip_window + dd, e);
566 w += e;
567 dd += e;
568 } else {
569 /* do it slow to avoid memcpy() overlap */
570 /* !NOMEMCPY */
571 do {
572 gunzip_window[w++] = gunzip_window[dd++];
573 } while (--e);
574 }
575 if (w == GUNZIP_WSIZE) {
576 gunzip_outbuf_count = w;
577 resume_copy = (nn != 0);
578 //flush_gunzip_window();
579 w = 0;
580 return 1;
581 }
582 } while (nn);
583 resume_copy = 0;
584 }
585 }
586
587 /* restore the globals from the locals */
588 gunzip_outbuf_count = w; /* restore global gunzip_window pointer */
589 gunzip_bb = bb; /* restore global bit buffer */
590 gunzip_bk = k;
591
592 /* normally just after call to inflate_codes, but save code by putting it here */
593 /* free the decoding tables, return */
594 huft_free(tl);
595 huft_free(td);
596
597 /* done */
598 return 0;
599 }
600 #undef ml
601 #undef md
602 #undef bb
603 #undef k
604 #undef w
605 #undef tl
606 #undef td
607 #undef bl
608 #undef bd
609 #undef nn
610 #undef dd
611
612
613 /* called once from inflate_block */
614 static void inflate_stored_setup(STATE_PARAM int my_n, int my_b, int my_k)
615 {
616 inflate_stored_n = my_n;
617 inflate_stored_b = my_b;
618 inflate_stored_k = my_k;
619 /* initialize gunzip_window position */
620 inflate_stored_w = gunzip_outbuf_count;
621 }
622 /* called once from inflate_get_next_window */
623 static int inflate_stored(STATE_PARAM_ONLY)
624 {
625 /* read and output the compressed data */
626 while (inflate_stored_n--) {
627 inflate_stored_b = fill_bitbuffer(PASS_STATE inflate_stored_b, &inflate_stored_k, 8);
628 gunzip_window[inflate_stored_w++] = (unsigned char) inflate_stored_b;
629 if (inflate_stored_w == GUNZIP_WSIZE) {
630 gunzip_outbuf_count = inflate_stored_w;
631 //flush_gunzip_window();
632 inflate_stored_w = 0;
633 inflate_stored_b >>= 8;
634 inflate_stored_k -= 8;
635 return 1; // We have a block
636 }
637 inflate_stored_b >>= 8;
638 inflate_stored_k -= 8;
639 }
640
641 /* restore the globals from the locals */
642 gunzip_outbuf_count = inflate_stored_w; /* restore global gunzip_window pointer */
643 gunzip_bb = inflate_stored_b; /* restore global bit buffer */
644 gunzip_bk = inflate_stored_k;
645 return 0; // Finished
646 }
647
648
649 /*
650 * decompress an inflated block
651 * e: last block flag
652 *
653 * GLOBAL VARIABLES: bb, kk,
654 */
655 /* Return values: -1 = inflate_stored, -2 = inflate_codes */
656 /* One callsite in inflate_get_next_window */
657 static int inflate_block(STATE_PARAM smallint *e)
658 {
659 unsigned t; /* block type */
660 unsigned b; /* bit buffer */
661 unsigned k; /* number of bits in bit buffer */
662
663 /* make local bit buffer */
664
665 b = gunzip_bb;
666 k = gunzip_bk;
667
668 /* read in last block bit */
669 b = fill_bitbuffer(PASS_STATE b, &k, 1);
670 *e = b & 1;
671 b >>= 1;
672 k -= 1;
673
674 /* read in block type */
675 b = fill_bitbuffer(PASS_STATE b, &k, 2);
676 t = (unsigned) b & 3;
677 b >>= 2;
678 k -= 2;
679
680 /* restore the global bit buffer */
681 gunzip_bb = b;
682 gunzip_bk = k;
683
684 /* inflate that block type */
685 switch (t) {
686 case 0: /* Inflate stored */
687 {
688 unsigned n; /* number of bytes in block */
689 unsigned b_stored; /* bit buffer */
690 unsigned k_stored; /* number of bits in bit buffer */
691
692 /* make local copies of globals */
693 b_stored = gunzip_bb; /* initialize bit buffer */
694 k_stored = gunzip_bk;
695
696 /* go to byte boundary */
697 n = k_stored & 7;
698 b_stored >>= n;
699 k_stored -= n;
700
701 /* get the length and its complement */
702 b_stored = fill_bitbuffer(PASS_STATE b_stored, &k_stored, 16);
703 n = ((unsigned) b_stored & 0xffff);
704 b_stored >>= 16;
705 k_stored -= 16;
706
707 b_stored = fill_bitbuffer(PASS_STATE b_stored, &k_stored, 16);
708 if (n != (unsigned) ((~b_stored) & 0xffff)) {
709 return 1; /* error in compressed data */
710 }
711 b_stored >>= 16;
712 k_stored -= 16;
713
714 inflate_stored_setup(PASS_STATE n, b_stored, k_stored); // Setup inflate_stored
715
716 return -1;
717 }
718 case 1:
719 /* Inflate fixed
720 * decompress an inflated type 1 (fixed Huffman codes) block. We should
721 * either replace this with a custom decoder, or at least precompute the
722 * Huffman tables. */
723 {
724 int i; /* temporary variable */
725 huft_t *tl; /* literal/length code table */
726 huft_t *td; /* distance code table */
727 unsigned bl; /* lookup bits for tl */
728 unsigned bd; /* lookup bits for td */
729 unsigned l[288]; /* length list for huft_build */
730
731 /* set up literal table */
732 for (i = 0; i < 144; i++) {
733 l[i] = 8;
734 }
735 for (; i < 256; i++) {
736 l[i] = 9;
737 }
738 for (; i < 280; i++) {
739 l[i] = 7;
740 }
741 for (; i < 288; i++) { /* make a complete, but wrong code set */
742 l[i] = 8;
743 }
744 bl = 7;
745 i = huft_build(l, 288, 257, cplens, cplext, &tl, &bl);
746 if (i != 0) {
747 return i;
748 }
749
750 /* set up distance table */
751 for (i = 0; i < 30; i++) { /* make an incomplete code set */
752 l[i] = 5;
753 }
754 bd = 5;
755 i = huft_build(l, 30, 0, cpdist, cpdext, &td, &bd);
756 if (i > 1) {
757 huft_free(tl);
758 return i;
759 }
760
761 /* decompress until an end-of-block code */
762 inflate_codes_setup(PASS_STATE tl, td, bl, bd); // Setup inflate_codes
763
764 /* huft_free code moved into inflate_codes */
765
766 return -2;
767 }
768 case 2: /* Inflate dynamic */
769 {
770 const int dbits = 6; /* bits in base distance lookup table */
771 const int lbits = 9; /* bits in base literal/length lookup table */
772
773 huft_t *tl; /* literal/length code table */
774 huft_t *td; /* distance code table */
775 unsigned i; /* temporary variables */
776 unsigned j;
777 unsigned l; /* last length */
778 unsigned m; /* mask for bit lengths table */
779 unsigned n; /* number of lengths to get */
780 unsigned bl; /* lookup bits for tl */
781 unsigned bd; /* lookup bits for td */
782 unsigned nb; /* number of bit length codes */
783 unsigned nl; /* number of literal/length codes */
784 unsigned nd; /* number of distance codes */
785
786 unsigned ll[286 + 30]; /* literal/length and distance code lengths */
787 unsigned b_dynamic; /* bit buffer */
788 unsigned k_dynamic; /* number of bits in bit buffer */
789
790 /* make local bit buffer */
791 b_dynamic = gunzip_bb;
792 k_dynamic = gunzip_bk;
793
794 /* read in table lengths */
795 b_dynamic = fill_bitbuffer(PASS_STATE b_dynamic, &k_dynamic, 5);
796 nl = 257 + ((unsigned) b_dynamic & 0x1f); /* number of literal/length codes */
797
798 b_dynamic >>= 5;
799 k_dynamic -= 5;
800 b_dynamic = fill_bitbuffer(PASS_STATE b_dynamic, &k_dynamic, 5);
801 nd = 1 + ((unsigned) b_dynamic & 0x1f); /* number of distance codes */
802
803 b_dynamic >>= 5;
804 k_dynamic -= 5;
805 b_dynamic = fill_bitbuffer(PASS_STATE b_dynamic, &k_dynamic, 4);
806 nb = 4 + ((unsigned) b_dynamic & 0xf); /* number of bit length codes */
807
808 b_dynamic >>= 4;
809 k_dynamic -= 4;
810 if (nl > 286 || nd > 30) {
811 return 1; /* bad lengths */
812 }
813
814 /* read in bit-length-code lengths */
815 for (j = 0; j < nb; j++) {
816 b_dynamic = fill_bitbuffer(PASS_STATE b_dynamic, &k_dynamic, 3);
817 ll[border[j]] = (unsigned) b_dynamic & 7;
818 b_dynamic >>= 3;
819 k_dynamic -= 3;
820 }
821 for (; j < 19; j++) {
822 ll[border[j]] = 0;
823 }
824
825 /* build decoding table for trees--single level, 7 bit lookup */
826 bl = 7;
827 i = huft_build(ll, 19, 19, NULL, NULL, &tl, &bl);
828 if (i != 0) {
829 if (i == 1) {
830 huft_free(tl);
831 }
832 return i; /* incomplete code set */
833 }
834
835 /* read in literal and distance code lengths */
836 n = nl + nd;
837 m = mask_bits[bl];
838 i = l = 0;
839 while ((unsigned) i < n) {
840 b_dynamic = fill_bitbuffer(PASS_STATE b_dynamic, &k_dynamic, (unsigned)bl);
841 j = (td = tl + ((unsigned) b_dynamic & m))->b;
842 b_dynamic >>= j;
843 k_dynamic -= j;
844 j = td->v.n;
845 if (j < 16) { /* length of code in bits (0..15) */
846 ll[i++] = l = j; /* save last length in l */
847 } else if (j == 16) { /* repeat last length 3 to 6 times */
848 b_dynamic = fill_bitbuffer(PASS_STATE b_dynamic, &k_dynamic, 2);
849 j = 3 + ((unsigned) b_dynamic & 3);
850 b_dynamic >>= 2;
851 k_dynamic -= 2;
852 if ((unsigned) i + j > n) {
853 return 1;
854 }
855 while (j--) {
856 ll[i++] = l;
857 }
858 } else if (j == 17) { /* 3 to 10 zero length codes */
859 b_dynamic = fill_bitbuffer(PASS_STATE b_dynamic, &k_dynamic, 3);
860 j = 3 + ((unsigned) b_dynamic & 7);
861 b_dynamic >>= 3;
862 k_dynamic -= 3;
863 if ((unsigned) i + j > n) {
864 return 1;
865 }
866 while (j--) {
867 ll[i++] = 0;
868 }
869 l = 0;
870 } else { /* j == 18: 11 to 138 zero length codes */
871 b_dynamic = fill_bitbuffer(PASS_STATE b_dynamic, &k_dynamic, 7);
872 j = 11 + ((unsigned) b_dynamic & 0x7f);
873 b_dynamic >>= 7;
874 k_dynamic -= 7;
875 if ((unsigned) i + j > n) {
876 return 1;
877 }
878 while (j--) {
879 ll[i++] = 0;
880 }
881 l = 0;
882 }
883 }
884
885 /* free decoding table for trees */
886 huft_free(tl);
887
888 /* restore the global bit buffer */
889 gunzip_bb = b_dynamic;
890 gunzip_bk = k_dynamic;
891
892 /* build the decoding tables for literal/length and distance codes */
893 bl = lbits;
894
895 i = huft_build(ll, nl, 257, cplens, cplext, &tl, &bl);
896 if (i != 0) {
897 if (i == 1) {
898 //shouldn't we propagate error?
899 bb_error_msg_and_die("incomplete literal tree");
900 /* huft_free(tl); */
901 }
902 return i; /* incomplete code set */
903 }
904
905 bd = dbits;
906 i = huft_build(ll + nl, nd, 0, cpdist, cpdext, &td, &bd);
907 if (i != 0) {
908 if (i == 1) {
909 //shouldn't we propagate error?
910 bb_error_msg_and_die("incomplete distance tree");
911 /* huft_free(td); */
912 }
913 huft_free(tl);
914 return i; /* incomplete code set */
915 }
916
917 /* decompress until an end-of-block code */
918 inflate_codes_setup(PASS_STATE tl, td, bl, bd); // Setup inflate_codes
919
920 /* huft_free code moved into inflate_codes */
921
922 return -2;
923 }
924 default:
925 /* bad block type */
926 //shouldn't we propagate error?
927 bb_error_msg_and_die("bad block type %d", t);
928 }
929 }
930
931 /* Two callsites, both in inflate_get_next_window */
932 static void calculate_gunzip_crc(STATE_PARAM_ONLY)
933 {
934 int n;
935 for (n = 0; n < gunzip_outbuf_count; n++) {
936 gunzip_crc = gunzip_crc_table[((int) gunzip_crc ^ (gunzip_window[n])) & 0xff] ^ (gunzip_crc >> 8);
937 }
938 gunzip_bytes_out += gunzip_outbuf_count;
939 }
940
941 /* One callsite in inflate_unzip_internal */
942 static int inflate_get_next_window(STATE_PARAM_ONLY)
943 {
944 gunzip_outbuf_count = 0;
945
946 while (1) {
947 int ret;
948
949 if (need_another_block) {
950 if (end_reached) {
951 calculate_gunzip_crc(PASS_STATE_ONLY);
952 end_reached = 0;
953 need_another_block = 1;
954 return 0; /* Last block */
955 }
956 method = inflate_block(PASS_STATE &end_reached);
957 need_another_block = 0;
958 }
959
960 switch (method) {
961 case -1:
962 ret = inflate_stored(PASS_STATE_ONLY);
963 break;
964 case -2:
965 ret = inflate_codes(PASS_STATE_ONLY);
966 break;
967 default:
968 //shouldn't we propagate error?
969 bb_error_msg_and_die("inflate error %d", method);
970 }
971
972 if (ret == 1) {
973 calculate_gunzip_crc(PASS_STATE_ONLY);
974 return 1; // More data left
975 }
976 need_another_block = 1; // End of that block
977 }
978 /* Doesnt get here */
979 }
980
981
982 /* Called from inflate_gunzip() and inflate_unzip() */
983 /* NB: bytebuffer is allocated here but freeing it is left to the caller! */
984 static USE_DESKTOP(long long) int
985 inflate_unzip_internal(STATE_PARAM int in, int out)
986 {
987 USE_DESKTOP(long long) int n = 0;
988 ssize_t nwrote;
989
990 /* Allocate all global buffers (for DYN_ALLOC option) */
991 gunzip_window = xmalloc(GUNZIP_WSIZE);
992 gunzip_outbuf_count = 0;
993 gunzip_bytes_out = 0;
994 gunzip_src_fd = in;
995
996 /* initialize gunzip_window, bit buffer */
997 gunzip_bk = 0;
998 gunzip_bb = 0;
999
1000 /* Create the crc table */
1001 gunzip_crc_table = crc32_filltable(0);
1002 gunzip_crc = ~0;
1003
1004 /* Allocate space for buffer */
1005 bytebuffer = xmalloc(bytebuffer_max);
1006
1007 while (1) {
1008 int r = inflate_get_next_window(PASS_STATE_ONLY);
1009 nwrote = full_write(out, gunzip_window, gunzip_outbuf_count);
1010 if (nwrote != gunzip_outbuf_count) {
1011 bb_perror_msg("write");
1012 n = -1;
1013 goto ret;
1014 }
1015 USE_DESKTOP(n += nwrote;)
1016 if (r == 0) break;
1017 }
1018
1019 /* Store unused bytes in a global buffer so calling applets can access it */
1020 if (gunzip_bk >= 8) {
1021 /* Undo too much lookahead. The next read will be byte aligned
1022 * so we can discard unused bits in the last meaningful byte. */
1023 bytebuffer_offset--;
1024 bytebuffer[bytebuffer_offset] = gunzip_bb & 0xff;
1025 gunzip_bb >>= 8;
1026 gunzip_bk -= 8;
1027 }
1028 ret:
1029 /* Cleanup */
1030 free(gunzip_window);
1031 free(gunzip_crc_table);
1032 return n;
1033 }
1034
1035
1036 USE_DESKTOP(long long) int
1037 inflate_unzip(inflate_unzip_result *res, unsigned bufsize, int in, int out)
1038 {
1039 USE_DESKTOP(long long) int n;
1040 DECLARE_STATE;
1041
1042 ALLOC_STATE;
1043
1044 bytebuffer_max = bufsize + 8;
1045 bytebuffer_offset = 4;
1046 n = inflate_unzip_internal(PASS_STATE in, out);
1047
1048 res->crc = gunzip_crc;
1049 res->bytes_out = gunzip_bytes_out;
1050 free(bytebuffer);
1051 DEALLOC_STATE;
1052 return n;
1053 }
1054
1055
1056 USE_DESKTOP(long long) int
1057 inflate_gunzip(int in, int out)
1058 {
1059 uint32_t stored_crc = 0;
1060 unsigned count;
1061 USE_DESKTOP(long long) int n;
1062 DECLARE_STATE;
1063
1064 ALLOC_STATE;
1065
1066 bytebuffer_max = 0x8000;
1067 n = inflate_unzip_internal(PASS_STATE in, out);
1068
1069 if (n < 0) goto ret;
1070
1071 /* top up the input buffer with the rest of the trailer */
1072 count = bytebuffer_size - bytebuffer_offset;
1073 if (count < 8) {
1074 xread(in, &bytebuffer[bytebuffer_size], 8 - count);
1075 //shouldn't we propagate error?
1076 bytebuffer_size += 8 - count;
1077 }
1078 for (count = 0; count != 4; count++) {
1079 stored_crc |= (bytebuffer[bytebuffer_offset] << (count * 8));
1080 bytebuffer_offset++;
1081 }
1082
1083 /* Validate decompression - crc */
1084 if (stored_crc != (~gunzip_crc)) {
1085 bb_error_msg("crc error");
1086 n = -1;
1087 goto ret;
1088 }
1089
1090 /* Validate decompression - size */
1091 if (gunzip_bytes_out !=
1092 (bytebuffer[bytebuffer_offset] | (bytebuffer[bytebuffer_offset+1] << 8) |
1093 (bytebuffer[bytebuffer_offset+2] << 16) | (bytebuffer[bytebuffer_offset+3] << 24))
1094 ) {
1095 bb_error_msg("incorrect length");
1096 n = -1;
1097 }
1098 ret:
1099 free(bytebuffer);
1100 DEALLOC_STATE;
1101 return n;
1102 }