source: mainline/boot/generic/src/inflate.c@ a347a11

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since a347a11 was 568db0f, checked in by Martin Decky <martin@…>, 15 years ago

remove forgotten piece of comment

  • Property mode set to 100644
File size: 17.5 KB
Line 
1/*
2 * Copyright (c) 2010 Mark Adler
3 * Copyright (c) 2010 Martin Decky
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 *
10 * - Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * - Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 * - The name of the author may not be used to endorse or promote products
16 * derived from this software without specific prior written permission.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
19 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
20 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
21 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
22 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
23 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 */
29
30/** @file
31 * @brief Implementation of inflate decompression
32 *
33 * A simple inflate implementation (decompression of `deflate' stream as
34 * described by RFC 1951) based on puff.c by Mark Adler. It is not optimized
35 * for speed but for readability as it is used as part of the bootloader and
36 * any miss-optimization might be hard to debug.
37 *
38 * All dynamically allocated memory memory is taken from the stack. The
39 * stack usage should be typically bounded by 2 KB.
40 *
41 * Original copyright notice:
42 *
43 * Copyright (C) 2002-2010 Mark Adler, all rights reserved
44 * version 2.1, 4 Apr 2010
45 *
46 * This software is provided 'as-is', without any express or implied
47 * warranty. In no event will the author be held liable for any damages
48 * arising from the use of this software.
49 *
50 * Permission is granted to anyone to use this software for any purpose,
51 * including commercial applications, and to alter it and redistribute it
52 * freely, subject to the following restrictions:
53 *
54 * 1. The origin of this software must not be misrepresented; you must not
55 * claim that you wrote the original software. If you use this software
56 * in a product, an acknowledgment in the product documentation would be
57 * appreciated but is not required.
58 * 2. Altered source versions must be plainly marked as such, and must not
59 * be misrepresented as being the original software.
60 * 3. This notice may not be removed or altered from any source
61 * distribution.
62 *
63 * Mark Adler <madler@alumni.caltech.edu>
64 *
65 */
66
67#include <typedefs.h>
68#include <errno.h>
69#include <memstr.h>
70#include <inflate.h>
71
72/** Maximum bits in the Huffman code */
73#define MAX_HUFFMAN_BIT 15
74
75/** Number of length codes */
76#define MAX_LEN 29
77/** Number of distance codes */
78#define MAX_DIST 30
79/** Number of order codes */
80#define MAX_ORDER 19
81/** Number of literal/length codes */
82#define MAX_LITLEN 286
83/** Number of fixed literal/length codes */
84#define MAX_FIXED_LITLEN 288
85
86/** Number of all codes */
87#define MAX_CODE (MAX_LITLEN + MAX_DIST)
88
89/** Check for input buffer overrun condition */
90#define CHECK_OVERRUN(state) \
91 do { \
92 if ((state).overrun) \
93 return ELIMIT; \
94 } while (false)
95
96
97/** Inflate algorithm state
98 *
99 */
100typedef struct {
101 uint8_t *dest; /**< Output buffer */
102 size_t destlen; /**< Output buffer size */
103 size_t destcnt; /**< Position in the output buffer */
104
105 uint8_t *src; /**< Input buffer */
106 size_t srclen; /**< Input buffer size */
107 size_t srccnt; /**< Position in the input buffer */
108
109 uint16_t bitbuf; /**< Bit buffer */
110 size_t bitlen; /**< Number of bits in the bit buffer */
111
112 bool overrun; /**< Overrun condition */
113} inflate_state_t;
114
115/** Huffman code description
116 *
117 */
118typedef struct {
119 uint16_t *count; /**< Array of symbol counts */
120 uint16_t *symbol; /**< Array of symbols */
121} huffman_t;
122
123/** Length codes
124 *
125 */
126static const uint16_t lens[MAX_LEN] = {
127 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31,
128 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258
129};
130
131/** Extended length codes
132 *
133 */
134static const uint16_t lens_ext[MAX_LEN] = {
135 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2,
136 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0
137};
138
139/** Distance codes
140 *
141 */
142static const uint16_t dists[MAX_DIST] = {
143 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193,
144 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145,
145 8193, 12289, 16385, 24577
146};
147
148/** Extended distance codes
149 *
150 */
151static const uint16_t dists_ext[MAX_DIST] = {
152 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6,
153 7, 7, 8, 8, 9, 9, 10, 10, 11, 11,
154 12, 12, 13, 13
155};
156
157/** Order codes
158 *
159 */
160static const short order[MAX_ORDER] = {
161 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15
162};
163
164/** Static length symbol counts
165 *
166 */
167static uint16_t len_count[MAX_HUFFMAN_BIT + 1] = {
168 0, 0, 0, 0, 0, 0, 0, 24, 152, 112, 0, 0, 0, 0, 0, 0
169};
170
171/** Static length symbols
172 *
173 */
174static uint16_t len_symbol[MAX_FIXED_LITLEN] = {
175 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268,
176 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 0, 1, 2,
177 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
178 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36,
179 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52,
180 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68,
181 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84,
182 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100,
183 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113,
184 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126,
185 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139,
186 140, 141, 142, 143, 280, 281, 282, 283, 284, 285, 286, 287, 144,
187 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157,
188 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170,
189 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183,
190 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196,
191 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209,
192 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222,
193 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235,
194 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248,
195 249, 250, 251, 252, 253, 254, 255
196};
197
198/** Static distance symbol counts
199 *
200 */
201static uint16_t dist_count[MAX_HUFFMAN_BIT + 1] = {
202 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
203};
204
205/** Static distance symbols
206 *
207 */
208static uint16_t dist_symbol[MAX_DIST] = {
209 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
210 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29
211};
212
213/** Huffman code for lengths
214 *
215 */
216static huffman_t len_code = {
217 .count = len_count,
218 .symbol = len_symbol
219};
220
221/** Huffman code for distances
222 *
223 */
224static huffman_t dist_code = {
225 .count = dist_count,
226 .symbol = dist_symbol
227};
228
229/** Get bits from the bit buffer
230 *
231 * @param state Inflate state.
232 * @param cnt Number of bits to return (at most 16).
233 *
234 * @return Returned bits.
235 *
236 */
237static inline uint16_t get_bits(inflate_state_t *state, size_t cnt)
238{
239 /* Bit accumulator for at least 20 bits */
240 uint32_t val = state->bitbuf;
241
242 while (state->bitlen < cnt) {
243 if (state->srccnt == state->srclen) {
244 state->overrun = true;
245 return 0;
246 }
247
248 /* Load 8 more bits */
249 val |= ((uint32_t) state->src[state->srccnt]) << state->bitlen;
250 state->srccnt++;
251 state->bitlen += 8;
252 }
253
254 /* Update bits in the buffer */
255 state->bitbuf = (uint16_t) (val >> cnt);
256 state->bitlen -= cnt;
257
258 return ((uint16_t) (val & ((1 << cnt) - 1)));
259}
260
261/** Decode `stored' block
262 *
263 * @param state Inflate state.
264 *
265 * @return EOK on success.
266 * @return ELIMIT on input buffer overrun.
267 * @return ENOMEM on output buffer overrun.
268 * @return EINVAL on invalid data.
269 *
270 */
271static int inflate_stored(inflate_state_t *state)
272{
273 /* Discard bits in the bit buffer */
274 state->bitbuf = 0;
275 state->bitlen = 0;
276
277 if (state->srccnt + 4 > state->srclen)
278 return ELIMIT;
279
280 uint16_t len =
281 state->src[state->srccnt] | (state->src[state->srccnt + 1] << 8);
282 uint16_t len_compl =
283 state->src[state->srccnt + 2] | (state->src[state->srccnt + 3] << 8);
284
285 /* Check block length and its complement */
286 if (((int16_t) len) != ~((int16_t) len_compl))
287 return EINVAL;
288
289 state->srccnt += 4;
290
291 /* Check input buffer size */
292 if (state->srccnt + len > state->srclen)
293 return ELIMIT;
294
295 /* Check output buffer size */
296 if (state->destcnt + len > state->destlen)
297 return ENOMEM;
298
299 /* Copy data */
300 memcpy(state->dest + state->destcnt, state->src + state->srccnt, len);
301 state->srccnt += len;
302 state->destcnt += len;
303
304 return EOK;
305}
306
307/** Decode a symbol using the Huffman code
308 *
309 * @param state Inflate state.
310 * @param huffman Huffman code.
311 * @param symbol Decoded symbol.
312 *
313 * @param EOK on success.
314 * @param EINVAL on invalid Huffman code.
315 *
316 */
317static int huffman_decode(inflate_state_t *state, huffman_t *huffman,
318 uint16_t *symbol)
319{
320 uint16_t code = 0; /* Decoded bits */
321 size_t first = 0; /* First code of the given length */
322 size_t index = 0; /* Index of the first code of the given length
323 in the symbol table */
324
325 size_t len; /* Current number of bits in the code */
326 for (len = 1; len <= MAX_HUFFMAN_BIT; len++) {
327 /* Get next bit */
328 code |= get_bits(state, 1);
329 CHECK_OVERRUN(*state);
330
331 uint16_t count = huffman->count[len];
332 if (code < first + count) {
333 /* Return decoded symbol */
334 *symbol = huffman->symbol[index + code - first];
335 return EOK;
336 }
337
338 /* Update for next length */
339 index += count;
340 first += count;
341 first <<= 1;
342 code <<= 1;
343 }
344
345 return EINVAL;
346}
347
348/** Construct Huffman tables from canonical Huffman code
349 *
350 * @param huffman Constructed Huffman tables.
351 * @param length Lengths of the canonical Huffman code.
352 * @param n Number of lengths.
353 *
354 * @return 0 if the Huffman code set is complete.
355 * @return Negative value for an over-subscribed code set.
356 * @return Positive value for an incomplete code set.
357 *
358 */
359static int16_t huffman_construct(huffman_t *huffman, uint16_t *length, size_t n)
360{
361 /* Count number of codes for each length */
362 size_t len;
363 for (len = 0; len <= MAX_HUFFMAN_BIT; len++)
364 huffman->count[len] = 0;
365
366 /* We assume that the lengths are within bounds */
367 size_t symbol;
368 for (symbol = 0; symbol < n; symbol++)
369 huffman->count[length[symbol]]++;
370
371 if (huffman->count[0] == n) {
372 /* The code is complete, but decoding will fail */
373 return 0;
374 }
375
376 /* Check for an over-subscribed or incomplete set of lengths */
377 int16_t left = 1;
378 for (len = 1; len <= MAX_HUFFMAN_BIT; len++) {
379 left <<= 1;
380 left -= huffman->count[len];
381 if (left < 0) {
382 /* Over-subscribed */
383 return left;
384 }
385 }
386
387 /* Generate offsets into symbol table */
388 uint16_t offs[MAX_HUFFMAN_BIT + 1];
389
390 offs[1] = 0;
391 for (len = 1; len < MAX_HUFFMAN_BIT; len++)
392 offs[len + 1] = offs[len] + huffman->count[len];
393
394 for (symbol = 0; symbol < n; symbol++) {
395 if (length[symbol] != 0) {
396 huffman->symbol[offs[length[symbol]]] = symbol;
397 offs[length[symbol]]++;
398 }
399 }
400
401 return left;
402}
403
404/** Decode literal/length and distance codes
405 *
406 * Decode until end-of-block code.
407 *
408 * @param state Inflate state.
409 * @param len_code Huffman code for literal/length.
410 * @param dist_code Huffman code for distance.
411 *
412 * @return EOK on success.
413 * @return ENOENT on distance too large.
414 * @return EINVAL on invalid Huffman code.
415 * @return ELIMIT on input buffer overrun.
416 * @return ENOMEM on output buffer overrun.
417 *
418 */
419static int inflate_codes(inflate_state_t *state, huffman_t* len_code,
420 huffman_t* dist_code)
421{
422 uint16_t symbol;
423
424 do {
425 int err = huffman_decode(state, len_code, &symbol);
426 if (err != EOK) {
427 /* Error decoding */
428 return err;
429 }
430
431 if (symbol < 256) {
432 /* Write out literal */
433 if (state->destcnt == state->destlen)
434 return ENOMEM;
435
436 state->dest[state->destcnt] = (uint8_t) symbol;
437 state->destcnt++;
438 } else if (symbol > 256) {
439 /* Compute length */
440 symbol -= 257;
441 if (symbol >= 29)
442 return EINVAL;
443
444 size_t len = lens[symbol] + get_bits(state, lens_ext[symbol]);
445 CHECK_OVERRUN(*state);
446
447 /* Get distance */
448 err = huffman_decode(state, dist_code, &symbol);
449 if (err != EOK)
450 return err;
451
452 size_t dist = dists[symbol] + get_bits(state, dists_ext[symbol]);
453 if (dist > state->destcnt)
454 return ENOENT;
455
456 if (state->destcnt + len > state->destlen)
457 return ENOMEM;
458
459 while (len > 0) {
460 /* Copy len bytes from distance bytes back */
461 state->dest[state->destcnt]
462 = state->dest[state->destcnt - dist];
463 state->destcnt++;
464 len--;
465 }
466 }
467 } while (symbol != 256);
468
469 return EOK;
470}
471
472/** Decode `fixed codes' block
473 *
474 * @param state Inflate state.
475 * @param len_code Huffman code for literal/length.
476 * @param dist_code Huffman code for distance.
477 *
478 * @return EOK on success.
479 * @return ENOENT on distance too large.
480 * @return EINVAL on invalid Huffman code.
481 * @return ELIMIT on input buffer overrun.
482 * @return ENOMEM on output buffer overrun.
483 *
484 */
485static int inflate_fixed(inflate_state_t *state, huffman_t *len_code,
486 huffman_t *dist_code)
487{
488 return inflate_codes(state, len_code, dist_code);
489}
490
491/** Decode `dynamic codes' block
492 *
493 * @param state Inflate state.
494 *
495 * @return EOK on success.
496 * @return ENOENT on distance too large.
497 * @return EINVAL on invalid Huffman code.
498 * @return ELIMIT on input buffer overrun.
499 * @return ENOMEM on output buffer overrun.
500 *
501 */
502static int inflate_dynamic(inflate_state_t *state)
503{
504 uint16_t length[MAX_CODE];
505 uint16_t dyn_len_count[MAX_HUFFMAN_BIT + 1];
506 uint16_t dyn_len_symbol[MAX_LITLEN];
507 uint16_t dyn_dist_count[MAX_HUFFMAN_BIT + 1];
508 uint16_t dyn_dist_symbol[MAX_DIST];
509 huffman_t dyn_len_code;
510 huffman_t dyn_dist_code;
511
512 dyn_len_code.count = dyn_len_count;
513 dyn_len_code.symbol = dyn_len_symbol;
514
515 dyn_dist_code.count = dyn_dist_count;
516 dyn_dist_code.symbol = dyn_dist_symbol;
517
518 /* Get number of bits in each table */
519 uint16_t nlen = get_bits(state, 5) + 257;
520 CHECK_OVERRUN(*state);
521
522 uint16_t ndist = get_bits(state, 5) + 1;
523 CHECK_OVERRUN(*state);
524
525 uint16_t ncode = get_bits(state, 4) + 4;
526 CHECK_OVERRUN(*state);
527
528 if ((nlen > MAX_LITLEN) || (ndist > MAX_DIST)
529 || (ncode > MAX_ORDER))
530 return EINVAL;
531
532 /* Read code length code lengths */
533 uint16_t index;
534 for (index = 0; index < ncode; index++) {
535 length[order[index]] = get_bits(state, 3);
536 CHECK_OVERRUN(*state);
537 }
538
539 /* Set missing lengths to zero */
540 for (index = ncode; index < MAX_ORDER; index++)
541 length[order[index]] = 0;
542
543 /* Build Huffman code */
544 int16_t rc = huffman_construct(&dyn_len_code, length, MAX_ORDER);
545 if (rc != 0)
546 return EINVAL;
547
548 /* Read length/literal and distance code length tables */
549 index = 0;
550 while (index < nlen + ndist) {
551 uint16_t symbol;
552 int err = huffman_decode(state, &dyn_len_code, &symbol);
553 if (err != EOK)
554 return EOK;
555
556 if (symbol < 16) {
557 length[index] = symbol;
558 index++;
559 } else {
560 uint16_t len = 0;
561
562 if (symbol == 16) {
563 if (index == 0)
564 return EINVAL;
565
566 len = length[index - 1];
567 symbol = get_bits(state, 2) + 3;
568 CHECK_OVERRUN(*state);
569 } else if (symbol == 17) {
570 symbol = get_bits(state, 3) + 3;
571 CHECK_OVERRUN(*state);
572 } else {
573 symbol = get_bits(state, 7) + 11;
574 CHECK_OVERRUN(*state);
575 }
576
577 if (index + symbol > nlen + ndist)
578 return EINVAL;
579
580 while (symbol > 0) {
581 length[index] = len;
582 index++;
583 symbol--;
584 }
585 }
586 }
587
588 /* Check for end-of-block code */
589 if (length[256] == 0)
590 return EINVAL;
591
592 /* Build Huffman tables for literal/length codes */
593 rc = huffman_construct(&dyn_len_code, length, nlen);
594 if ((rc < 0) || ((rc > 0) && (dyn_len_code.count[0] + 1 != nlen)))
595 return EINVAL;
596
597 /* Build Huffman tables for distance codes */
598 rc = huffman_construct(&dyn_dist_code, length + nlen, ndist);
599 if ((rc < 0) || ((rc > 0) && (dyn_dist_code.count[0] + 1 != ndist)))
600 return EINVAL;
601
602 return inflate_codes(state, &dyn_len_code, &dyn_dist_code);
603}
604
605/** Inflate data
606 *
607 * @param src Source data buffer.
608 * @param srclen Source buffer size (bytes).
609 * @param dest Destination data buffer.
610 * @param destlen Destination buffer size (bytes).
611 *
612 * @return EOK on success.
613 * @return ENOENT on distance too large.
614 * @return EINVAL on invalid Huffman code or invalid deflate data.
615 * @return ELIMIT on input buffer overrun.
616 * @return ENOMEM on output buffer overrun.
617 *
618 */
619int inflate(void *src, size_t srclen, void *dest, size_t destlen)
620{
621 /* Initialize the state */
622 inflate_state_t state;
623
624 state.dest = (uint8_t *) dest;
625 state.destlen = destlen;
626 state.destcnt = 0;
627
628 state.src = (uint8_t *) src;
629 state.srclen = srclen;
630 state.srccnt = 0;
631
632 state.bitbuf = 0;
633 state.bitlen = 0;
634
635 state.overrun = false;
636
637 uint16_t last;
638 int ret = 0;
639
640 do {
641 /* Last block is indicated by a non-zero bit */
642 last = get_bits(&state, 1);
643 CHECK_OVERRUN(state);
644
645 /* Block type */
646 uint16_t type = get_bits(&state, 2);
647 CHECK_OVERRUN(state);
648
649 switch (type) {
650 case 0:
651 ret = inflate_stored(&state);
652 break;
653 case 1:
654 ret = inflate_fixed(&state, &len_code, &dist_code);
655 break;
656 case 2:
657 ret = inflate_dynamic(&state);
658 break;
659 default:
660 ret = EINVAL;
661 }
662 } while ((!last) && (ret == 0));
663
664 return ret;
665}
Note: See TracBrowser for help on using the repository browser.