source: mainline/boot/generic/src/inflate.c@ 10d65d70

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since 10d65d70 was 10d65d70, checked in by Jiří Zárevúcky <jiri.zarevucky@…>, 7 years ago

Use compiler-provided freestanding headers

Standard-compliant C compiler must provide these, so there is no point
in us trying to guess or repeat the correct contents.
This includes <float.h>, <iso646.h>, <limits.h>, <stdalign.h>, <stdarg.h>,
<stdbool.h>, <stddef.h>, <stdint.h>, and <stdnoreturn.h>.

<stdint.h> and <limits.h> need more work.

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