diff --git a/decompressor/gzip/tinflate.c b/decompressor/gzip/tinflate.c index 67993904..79d43e83 100644 --- a/decompressor/gzip/tinflate.c +++ b/decompressor/gzip/tinflate.c @@ -53,13 +53,61 @@ struct tinf_data { struct tinf_tree dtree; /* Distance tree */ }; +/* -- Utility functions -- */ + +static unsigned int read_le16(const unsigned char *p) { + return ((unsigned int) p[0]) + | ((unsigned int) p[1] << 8); +} + +/* Build fixed Huffman trees */ +static void tinf_build_fixed_trees(struct tinf_tree *lt, struct tinf_tree *dt) { + int i; + + /* Build fixed literal/length tree */ + for (i = 0; i < 16; ++i) { + lt->counts[i] = 0; + } + + lt->counts[7] = 24; + lt->counts[8] = 152; + lt->counts[9] = 112; + + for (i = 0; i < 24; ++i) { + lt->symbols[i] = 256 + i; + } + for (i = 0; i < 144; ++i) { + lt->symbols[24 + i] = i; + } + for (i = 0; i < 8; ++i) { + lt->symbols[24 + 144 + i] = 280 + i; + } + for (i = 0; i < 112; ++i) { + lt->symbols[24 + 144 + 8 + i] = 144 + i; + } + + lt->max_sym = 285; + + /* Build fixed distance tree */ + for (i = 0; i < 16; ++i) { + dt->counts[i] = 0; + } + + dt->counts[5] = 32; + + for (i = 0; i < 32; ++i) { + dt->symbols[i] = i; + } + + dt->max_sym = 29; +} + /* Given an array of code lengths, build a tree */ static int tinf_build_tree(struct tinf_tree *t, const unsigned char *lengths, unsigned int num) { unsigned short offs[16]; unsigned int i, num_codes, available; - for (i = 0; i < 16; ++i) { t->counts[i] = 0; } @@ -412,10 +460,10 @@ static int tinf_inflate_uncompressed_block(struct tinf_data *d) { } /* Get length */ - length = *(d->source); + length = read_le16(d->source); /* Get one's complement of length */ - invlength = *(d->source + 2); + invlength = read_le16(d->source + 2); /* Check length */ if (length != (~invlength & 0x0000FFFF)) { @@ -424,10 +472,6 @@ static int tinf_inflate_uncompressed_block(struct tinf_data *d) { d->source += 4; - if ((unsigned int)((d->source_end - d->source)) < length) { - return TINF_DATA_ERROR; - } - /* Copy block */ while (length--) { *d->dest++ = *d->source++; @@ -440,49 +484,6 @@ static int tinf_inflate_uncompressed_block(struct tinf_data *d) { return TINF_OK; } -/* Build fixed Huffman trees */ -static void tinf_build_fixed_trees(struct tinf_tree *lt, struct tinf_tree *dt) { - int i; - - /* Build fixed literal/length tree */ - for (i = 0; i < 16; ++i) { - lt->counts[i] = 0; - } - - lt->counts[7] = 24; - lt->counts[8] = 152; - lt->counts[9] = 112; - - for (i = 0; i < 24; ++i) { - lt->symbols[i] = 256 + i; - } - for (i = 0; i < 144; ++i) { - lt->symbols[24 + i] = i; - } - for (i = 0; i < 8; ++i) { - lt->symbols[24 + 144 + i] = 280 + i; - } - for (i = 0; i < 112; ++i) { - lt->symbols[24 + 144 + 8 + i] = 144 + i; - } - - lt->max_sym = 285; - - /* Build fixed distance tree */ - for (i = 0; i < 16; ++i) { - dt->counts[i] = 0; - } - - dt->counts[5] = 32; - - for (i = 0; i < 32; ++i) { - dt->symbols[i] = i; - } - - dt->max_sym = 29; -} - - /* Inflate a block of data compressed with fixed Huffman trees */ static int tinf_inflate_fixed_block(struct tinf_data *d) { /* Build fixed Huffman trees */ @@ -492,7 +493,6 @@ static int tinf_inflate_fixed_block(struct tinf_data *d) { return tinf_inflate_block_data(d, &d->ltree, &d->dtree); } - /* Inflate a block of data compressed with dynamic Huffman trees */ static int tinf_inflate_dynamic_block(struct tinf_data *d) { /* Decode trees from stream */ @@ -506,6 +506,8 @@ static int tinf_inflate_dynamic_block(struct tinf_data *d) { return tinf_inflate_block_data(d, &d->ltree, &d->dtree); } +/* -- Public functions -- */ + /* Inflate stream from source to dest */ int tinf_uncompress(void *dest, const void *source, unsigned int sourceLen) { diff --git a/limine-pxe.bin b/limine-pxe.bin index a72994ff..ddb3dc36 100644 Binary files a/limine-pxe.bin and b/limine-pxe.bin differ diff --git a/limine.bin b/limine.bin index 5ffe91c5..00145c04 100644 Binary files a/limine.bin and b/limine.bin differ