source: mainline/boot/generic/src/inflate.c@ 09ab0a9a

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since 09ab0a9a was 09ab0a9a, checked in by Jiri Svoboda <jiri@…>, 7 years ago

Fix vertical spacing with new Ccheck revision.

  • 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 <errno.h>
70#include <memstr.h>
71#include <inflate.h>
72
73/** Maximum bits in the Huffman code */
74#define MAX_HUFFMAN_BIT 15
75
76/** Number of length codes */
77#define MAX_LEN 29
78/** Number of distance codes */
79#define MAX_DIST 30
80/** Number of order codes */
81#define MAX_ORDER 19
82/** Number of literal/length codes */
83#define MAX_LITLEN 286
84/** Number of fixed literal/length codes */
85#define MAX_FIXED_LITLEN 288
86
87/** Number of all codes */
88#define MAX_CODE (MAX_LITLEN + MAX_DIST)
89
90/** Check for input buffer overrun condition */
91#define CHECK_OVERRUN(state) \
92 do { \
93 if ((state).overrun) \
94 return ELIMIT; \
95 } while (false)
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 /* Decoded bits */
321 uint16_t code = 0;
322
323 /* First code of the given length */
324 size_t first = 0;
325
326 /*
327 * Index of the first code of the given length
328 * in the symbol table
329 */
330 size_t index = 0;
331
332 size_t len; /* Current number of bits in the code */
333 for (len = 1; len <= MAX_HUFFMAN_BIT; len++) {
334 /* Get next bit */
335 code |= get_bits(state, 1);
336 CHECK_OVERRUN(*state);
337
338 uint16_t count = huffman->count[len];
339 if (code < first + count) {
340 /* Return decoded symbol */
341 *symbol = huffman->symbol[index + code - first];
342 return EOK;
343 }
344
345 /* Update for next length */
346 index += count;
347 first += count;
348 first <<= 1;
349 code <<= 1;
350 }
351
352 return EINVAL;
353}
354
355/** Construct Huffman tables from canonical Huffman code
356 *
357 * @param huffman Constructed Huffman tables.
358 * @param length Lengths of the canonical Huffman code.
359 * @param n Number of lengths.
360 *
361 * @return 0 if the Huffman code set is complete.
362 * @return Negative value for an over-subscribed code set.
363 * @return Positive value for an incomplete code set.
364 *
365 */
366static int16_t huffman_construct(huffman_t *huffman, uint16_t *length, size_t n)
367{
368 /* Count number of codes for each length */
369 size_t len;
370 for (len = 0; len <= MAX_HUFFMAN_BIT; len++)
371 huffman->count[len] = 0;
372
373 /* We assume that the lengths are within bounds */
374 size_t symbol;
375 for (symbol = 0; symbol < n; symbol++)
376 huffman->count[length[symbol]]++;
377
378 if (huffman->count[0] == n) {
379 /* The code is complete, but decoding will fail */
380 return 0;
381 }
382
383 /* Check for an over-subscribed or incomplete set of lengths */
384 int16_t left = 1;
385 for (len = 1; len <= MAX_HUFFMAN_BIT; len++) {
386 left <<= 1;
387 left -= huffman->count[len];
388 if (left < 0) {
389 /* Over-subscribed */
390 return left;
391 }
392 }
393
394 /* Generate offsets into symbol table */
395 uint16_t offs[MAX_HUFFMAN_BIT + 1];
396
397 offs[1] = 0;
398 for (len = 1; len < MAX_HUFFMAN_BIT; len++)
399 offs[len + 1] = offs[len] + huffman->count[len];
400
401 for (symbol = 0; symbol < n; symbol++) {
402 if (length[symbol] != 0) {
403 huffman->symbol[offs[length[symbol]]] = symbol;
404 offs[length[symbol]]++;
405 }
406 }
407
408 return left;
409}
410
411/** Decode literal/length and distance codes
412 *
413 * Decode until end-of-block code.
414 *
415 * @param state Inflate state.
416 * @param len_code Huffman code for literal/length.
417 * @param dist_code Huffman code for distance.
418 *
419 * @return EOK on success.
420 * @return ENOENT on distance too large.
421 * @return EINVAL on invalid Huffman code.
422 * @return ELIMIT on input buffer overrun.
423 * @return ENOMEM on output buffer overrun.
424 *
425 */
426static int inflate_codes(inflate_state_t *state, huffman_t *len_code,
427 huffman_t *dist_code)
428{
429 uint16_t symbol;
430
431 do {
432 int err = huffman_decode(state, len_code, &symbol);
433 if (err != EOK) {
434 /* Error decoding */
435 return err;
436 }
437
438 if (symbol < 256) {
439 /* Write out literal */
440 if (state->destcnt == state->destlen)
441 return ENOMEM;
442
443 state->dest[state->destcnt] = (uint8_t) symbol;
444 state->destcnt++;
445 } else if (symbol > 256) {
446 /* Compute length */
447 symbol -= 257;
448 if (symbol >= 29)
449 return EINVAL;
450
451 size_t len = lens[symbol] + get_bits(state, lens_ext[symbol]);
452 CHECK_OVERRUN(*state);
453
454 /* Get distance */
455 err = huffman_decode(state, dist_code, &symbol);
456 if (err != EOK)
457 return err;
458
459 size_t dist = dists[symbol] + get_bits(state, dists_ext[symbol]);
460 if (dist > state->destcnt)
461 return ENOENT;
462
463 if (state->destcnt + len > state->destlen)
464 return ENOMEM;
465
466 while (len > 0) {
467 /* Copy len bytes from distance bytes back */
468 state->dest[state->destcnt] =
469 state->dest[state->destcnt - dist];
470 state->destcnt++;
471 len--;
472 }
473 }
474 } while (symbol != 256);
475
476 return EOK;
477}
478
479/** Decode `fixed codes' block
480 *
481 * @param state Inflate state.
482 * @param len_code Huffman code for literal/length.
483 * @param dist_code Huffman code for distance.
484 *
485 * @return EOK on success.
486 * @return ENOENT on distance too large.
487 * @return EINVAL on invalid Huffman code.
488 * @return ELIMIT on input buffer overrun.
489 * @return ENOMEM on output buffer overrun.
490 *
491 */
492static int inflate_fixed(inflate_state_t *state, huffman_t *len_code,
493 huffman_t *dist_code)
494{
495 return inflate_codes(state, len_code, dist_code);
496}
497
498/** Decode `dynamic codes' block
499 *
500 * @param state Inflate state.
501 *
502 * @return EOK on success.
503 * @return ENOENT on distance too large.
504 * @return EINVAL on invalid Huffman code.
505 * @return ELIMIT on input buffer overrun.
506 * @return ENOMEM on output buffer overrun.
507 *
508 */
509static int inflate_dynamic(inflate_state_t *state)
510{
511 uint16_t length[MAX_CODE];
512 uint16_t dyn_len_count[MAX_HUFFMAN_BIT + 1];
513 uint16_t dyn_len_symbol[MAX_LITLEN];
514 uint16_t dyn_dist_count[MAX_HUFFMAN_BIT + 1];
515 uint16_t dyn_dist_symbol[MAX_DIST];
516 huffman_t dyn_len_code;
517 huffman_t dyn_dist_code;
518
519 dyn_len_code.count = dyn_len_count;
520 dyn_len_code.symbol = dyn_len_symbol;
521
522 dyn_dist_code.count = dyn_dist_count;
523 dyn_dist_code.symbol = dyn_dist_symbol;
524
525 /* Get number of bits in each table */
526 uint16_t nlen = get_bits(state, 5) + 257;
527 CHECK_OVERRUN(*state);
528
529 uint16_t ndist = get_bits(state, 5) + 1;
530 CHECK_OVERRUN(*state);
531
532 uint16_t ncode = get_bits(state, 4) + 4;
533 CHECK_OVERRUN(*state);
534
535 if ((nlen > MAX_LITLEN) || (ndist > MAX_DIST) ||
536 (ncode > MAX_ORDER))
537 return EINVAL;
538
539 /* Read code length code lengths */
540 uint16_t index;
541 for (index = 0; index < ncode; index++) {
542 length[order[index]] = get_bits(state, 3);
543 CHECK_OVERRUN(*state);
544 }
545
546 /* Set missing lengths to zero */
547 for (index = ncode; index < MAX_ORDER; index++)
548 length[order[index]] = 0;
549
550 /* Build Huffman code */
551 int16_t rc = huffman_construct(&dyn_len_code, length, MAX_ORDER);
552 if (rc != 0)
553 return EINVAL;
554
555 /* Read length/literal and distance code length tables */
556 index = 0;
557 while (index < nlen + ndist) {
558 uint16_t symbol;
559 int err = huffman_decode(state, &dyn_len_code, &symbol);
560 if (err != EOK)
561 return EOK;
562
563 if (symbol < 16) {
564 length[index] = symbol;
565 index++;
566 } else {
567 uint16_t len = 0;
568
569 if (symbol == 16) {
570 if (index == 0)
571 return EINVAL;
572
573 len = length[index - 1];
574 symbol = get_bits(state, 2) + 3;
575 CHECK_OVERRUN(*state);
576 } else if (symbol == 17) {
577 symbol = get_bits(state, 3) + 3;
578 CHECK_OVERRUN(*state);
579 } else {
580 symbol = get_bits(state, 7) + 11;
581 CHECK_OVERRUN(*state);
582 }
583
584 if (index + symbol > nlen + ndist)
585 return EINVAL;
586
587 while (symbol > 0) {
588 length[index] = len;
589 index++;
590 symbol--;
591 }
592 }
593 }
594
595 /* Check for end-of-block code */
596 if (length[256] == 0)
597 return EINVAL;
598
599 /* Build Huffman tables for literal/length codes */
600 rc = huffman_construct(&dyn_len_code, length, nlen);
601 if ((rc < 0) || ((rc > 0) && (dyn_len_code.count[0] + 1 != nlen)))
602 return EINVAL;
603
604 /* Build Huffman tables for distance codes */
605 rc = huffman_construct(&dyn_dist_code, length + nlen, ndist);
606 if ((rc < 0) || ((rc > 0) && (dyn_dist_code.count[0] + 1 != ndist)))
607 return EINVAL;
608
609 return inflate_codes(state, &dyn_len_code, &dyn_dist_code);
610}
611
612/** Inflate data
613 *
614 * @param src Source data buffer.
615 * @param srclen Source buffer size (bytes).
616 * @param dest Destination data buffer.
617 * @param destlen Destination buffer size (bytes).
618 *
619 * @return EOK on success.
620 * @return ENOENT on distance too large.
621 * @return EINVAL on invalid Huffman code or invalid deflate data.
622 * @return ELIMIT on input buffer overrun.
623 * @return ENOMEM on output buffer overrun.
624 *
625 */
626int inflate(void *src, size_t srclen, void *dest, size_t destlen)
627{
628 /* Initialize the state */
629 inflate_state_t state;
630
631 state.dest = (uint8_t *) dest;
632 state.destlen = destlen;
633 state.destcnt = 0;
634
635 state.src = (uint8_t *) src;
636 state.srclen = srclen;
637 state.srccnt = 0;
638
639 state.bitbuf = 0;
640 state.bitlen = 0;
641
642 state.overrun = false;
643
644 uint16_t last;
645 int ret = 0;
646
647 do {
648 /* Last block is indicated by a non-zero bit */
649 last = get_bits(&state, 1);
650 CHECK_OVERRUN(state);
651
652 /* Block type */
653 uint16_t type = get_bits(&state, 2);
654 CHECK_OVERRUN(state);
655
656 switch (type) {
657 case 0:
658 ret = inflate_stored(&state);
659 break;
660 case 1:
661 ret = inflate_fixed(&state, &len_code, &dist_code);
662 break;
663 case 2:
664 ret = inflate_dynamic(&state);
665 break;
666 default:
667 ret = EINVAL;
668 }
669 } while ((!last) && (ret == 0));
670
671 return ret;
672}
Note: See TracBrowser for help on using the repository browser.