cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

lzx_decompress.c (19504B)


      1// SPDX-License-Identifier: GPL-2.0-or-later
      2/*
      3 * lzx_decompress.c - A decompressor for the LZX compression format, which can
      4 * be used in "System Compressed" files.  This is based on the code from wimlib.
      5 * This code only supports a window size (dictionary size) of 32768 bytes, since
      6 * this is the only size used in System Compression.
      7 *
      8 * Copyright (C) 2015 Eric Biggers
      9 */
     10
     11#include "decompress_common.h"
     12#include "lib.h"
     13
     14/* Number of literal byte values  */
     15#define LZX_NUM_CHARS			256
     16
     17/* The smallest and largest allowed match lengths  */
     18#define LZX_MIN_MATCH_LEN		2
     19#define LZX_MAX_MATCH_LEN		257
     20
     21/* Number of distinct match lengths that can be represented  */
     22#define LZX_NUM_LENS			(LZX_MAX_MATCH_LEN - LZX_MIN_MATCH_LEN + 1)
     23
     24/* Number of match lengths for which no length symbol is required  */
     25#define LZX_NUM_PRIMARY_LENS		7
     26#define LZX_NUM_LEN_HEADERS		(LZX_NUM_PRIMARY_LENS + 1)
     27
     28/* Valid values of the 3-bit block type field  */
     29#define LZX_BLOCKTYPE_VERBATIM		1
     30#define LZX_BLOCKTYPE_ALIGNED		2
     31#define LZX_BLOCKTYPE_UNCOMPRESSED	3
     32
     33/* Number of offset slots for a window size of 32768  */
     34#define LZX_NUM_OFFSET_SLOTS		30
     35
     36/* Number of symbols in the main code for a window size of 32768  */
     37#define LZX_MAINCODE_NUM_SYMBOLS	\
     38	(LZX_NUM_CHARS + (LZX_NUM_OFFSET_SLOTS * LZX_NUM_LEN_HEADERS))
     39
     40/* Number of symbols in the length code  */
     41#define LZX_LENCODE_NUM_SYMBOLS		(LZX_NUM_LENS - LZX_NUM_PRIMARY_LENS)
     42
     43/* Number of symbols in the precode  */
     44#define LZX_PRECODE_NUM_SYMBOLS		20
     45
     46/* Number of bits in which each precode codeword length is represented  */
     47#define LZX_PRECODE_ELEMENT_SIZE	4
     48
     49/* Number of low-order bits of each match offset that are entropy-encoded in
     50 * aligned offset blocks
     51 */
     52#define LZX_NUM_ALIGNED_OFFSET_BITS	3
     53
     54/* Number of symbols in the aligned offset code  */
     55#define LZX_ALIGNEDCODE_NUM_SYMBOLS	(1 << LZX_NUM_ALIGNED_OFFSET_BITS)
     56
     57/* Mask for the match offset bits that are entropy-encoded in aligned offset
     58 * blocks
     59 */
     60#define LZX_ALIGNED_OFFSET_BITMASK	((1 << LZX_NUM_ALIGNED_OFFSET_BITS) - 1)
     61
     62/* Number of bits in which each aligned offset codeword length is represented  */
     63#define LZX_ALIGNEDCODE_ELEMENT_SIZE	3
     64
     65/* Maximum lengths (in bits) of the codewords in each Huffman code  */
     66#define LZX_MAX_MAIN_CODEWORD_LEN	16
     67#define LZX_MAX_LEN_CODEWORD_LEN	16
     68#define LZX_MAX_PRE_CODEWORD_LEN	((1 << LZX_PRECODE_ELEMENT_SIZE) - 1)
     69#define LZX_MAX_ALIGNED_CODEWORD_LEN	((1 << LZX_ALIGNEDCODE_ELEMENT_SIZE) - 1)
     70
     71/* The default "filesize" value used in pre/post-processing.  In the LZX format
     72 * used in cabinet files this value must be given to the decompressor, whereas
     73 * in the LZX format used in WIM files and system-compressed files this value is
     74 * fixed at 12000000.
     75 */
     76#define LZX_DEFAULT_FILESIZE		12000000
     77
     78/* Assumed block size when the encoded block size begins with a 0 bit.  */
     79#define LZX_DEFAULT_BLOCK_SIZE		32768
     80
     81/* Number of offsets in the recent (or "repeat") offsets queue.  */
     82#define LZX_NUM_RECENT_OFFSETS		3
     83
     84/* These values are chosen for fast decompression.  */
     85#define LZX_MAINCODE_TABLEBITS		11
     86#define LZX_LENCODE_TABLEBITS		10
     87#define LZX_PRECODE_TABLEBITS		6
     88#define LZX_ALIGNEDCODE_TABLEBITS	7
     89
     90#define LZX_READ_LENS_MAX_OVERRUN	50
     91
     92/* Mapping: offset slot => first match offset that uses that offset slot.
     93 */
     94static const u32 lzx_offset_slot_base[LZX_NUM_OFFSET_SLOTS + 1] = {
     95	0,	1,	2,	3,	4,	/* 0  --- 4  */
     96	6,	8,	12,	16,	24,	/* 5  --- 9  */
     97	32,	48,	64,	96,	128,	/* 10 --- 14 */
     98	192,	256,	384,	512,	768,	/* 15 --- 19 */
     99	1024,	1536,	2048,	3072,	4096,   /* 20 --- 24 */
    100	6144,	8192,	12288,	16384,	24576,	/* 25 --- 29 */
    101	32768,					/* extra     */
    102};
    103
    104/* Mapping: offset slot => how many extra bits must be read and added to the
    105 * corresponding offset slot base to decode the match offset.
    106 */
    107static const u8 lzx_extra_offset_bits[LZX_NUM_OFFSET_SLOTS] = {
    108	0,	0,	0,	0,	1,
    109	1,	2,	2,	3,	3,
    110	4,	4,	5,	5,	6,
    111	6,	7,	7,	8,	8,
    112	9,	9,	10,	10,	11,
    113	11,	12,	12,	13,	13,
    114};
    115
    116/* Reusable heap-allocated memory for LZX decompression  */
    117struct lzx_decompressor {
    118
    119	/* Huffman decoding tables, and arrays that map symbols to codeword
    120	 * lengths
    121	 */
    122
    123	u16 maincode_decode_table[(1 << LZX_MAINCODE_TABLEBITS) +
    124					(LZX_MAINCODE_NUM_SYMBOLS * 2)];
    125	u8 maincode_lens[LZX_MAINCODE_NUM_SYMBOLS + LZX_READ_LENS_MAX_OVERRUN];
    126
    127
    128	u16 lencode_decode_table[(1 << LZX_LENCODE_TABLEBITS) +
    129					(LZX_LENCODE_NUM_SYMBOLS * 2)];
    130	u8 lencode_lens[LZX_LENCODE_NUM_SYMBOLS + LZX_READ_LENS_MAX_OVERRUN];
    131
    132
    133	u16 alignedcode_decode_table[(1 << LZX_ALIGNEDCODE_TABLEBITS) +
    134					(LZX_ALIGNEDCODE_NUM_SYMBOLS * 2)];
    135	u8 alignedcode_lens[LZX_ALIGNEDCODE_NUM_SYMBOLS];
    136
    137	u16 precode_decode_table[(1 << LZX_PRECODE_TABLEBITS) +
    138				 (LZX_PRECODE_NUM_SYMBOLS * 2)];
    139	u8 precode_lens[LZX_PRECODE_NUM_SYMBOLS];
    140
    141	/* Temporary space for make_huffman_decode_table()  */
    142	u16 working_space[2 * (1 + LZX_MAX_MAIN_CODEWORD_LEN) +
    143			  LZX_MAINCODE_NUM_SYMBOLS];
    144};
    145
    146static void undo_e8_translation(void *target, s32 input_pos)
    147{
    148	s32 abs_offset, rel_offset;
    149
    150	abs_offset = get_unaligned_le32(target);
    151	if (abs_offset >= 0) {
    152		if (abs_offset < LZX_DEFAULT_FILESIZE) {
    153			/* "good translation" */
    154			rel_offset = abs_offset - input_pos;
    155			put_unaligned_le32(rel_offset, target);
    156		}
    157	} else {
    158		if (abs_offset >= -input_pos) {
    159			/* "compensating translation" */
    160			rel_offset = abs_offset + LZX_DEFAULT_FILESIZE;
    161			put_unaligned_le32(rel_offset, target);
    162		}
    163	}
    164}
    165
    166/*
    167 * Undo the 'E8' preprocessing used in LZX.  Before compression, the
    168 * uncompressed data was preprocessed by changing the targets of suspected x86
    169 * CALL instructions from relative offsets to absolute offsets.  After
    170 * match/literal decoding, the decompressor must undo the translation.
    171 */
    172static void lzx_postprocess(u8 *data, u32 size)
    173{
    174	/*
    175	 * A worthwhile optimization is to push the end-of-buffer check into the
    176	 * relatively rare E8 case.  This is possible if we replace the last six
    177	 * bytes of data with E8 bytes; then we are guaranteed to hit an E8 byte
    178	 * before reaching end-of-buffer.  In addition, this scheme guarantees
    179	 * that no translation can begin following an E8 byte in the last 10
    180	 * bytes because a 4-byte offset containing E8 as its high byte is a
    181	 * large negative number that is not valid for translation.  That is
    182	 * exactly what we need.
    183	 */
    184	u8 *tail;
    185	u8 saved_bytes[6];
    186	u8 *p;
    187
    188	if (size <= 10)
    189		return;
    190
    191	tail = &data[size - 6];
    192	memcpy(saved_bytes, tail, 6);
    193	memset(tail, 0xE8, 6);
    194	p = data;
    195	for (;;) {
    196		while (*p != 0xE8)
    197			p++;
    198		if (p >= tail)
    199			break;
    200		undo_e8_translation(p + 1, p - data);
    201		p += 5;
    202	}
    203	memcpy(tail, saved_bytes, 6);
    204}
    205
    206/* Read a Huffman-encoded symbol using the precode.  */
    207static forceinline u32 read_presym(const struct lzx_decompressor *d,
    208					struct input_bitstream *is)
    209{
    210	return read_huffsym(is, d->precode_decode_table,
    211			    LZX_PRECODE_TABLEBITS, LZX_MAX_PRE_CODEWORD_LEN);
    212}
    213
    214/* Read a Huffman-encoded symbol using the main code.  */
    215static forceinline u32 read_mainsym(const struct lzx_decompressor *d,
    216					 struct input_bitstream *is)
    217{
    218	return read_huffsym(is, d->maincode_decode_table,
    219			    LZX_MAINCODE_TABLEBITS, LZX_MAX_MAIN_CODEWORD_LEN);
    220}
    221
    222/* Read a Huffman-encoded symbol using the length code.  */
    223static forceinline u32 read_lensym(const struct lzx_decompressor *d,
    224					struct input_bitstream *is)
    225{
    226	return read_huffsym(is, d->lencode_decode_table,
    227			    LZX_LENCODE_TABLEBITS, LZX_MAX_LEN_CODEWORD_LEN);
    228}
    229
    230/* Read a Huffman-encoded symbol using the aligned offset code.  */
    231static forceinline u32 read_alignedsym(const struct lzx_decompressor *d,
    232					    struct input_bitstream *is)
    233{
    234	return read_huffsym(is, d->alignedcode_decode_table,
    235			    LZX_ALIGNEDCODE_TABLEBITS,
    236			    LZX_MAX_ALIGNED_CODEWORD_LEN);
    237}
    238
    239/*
    240 * Read the precode from the compressed input bitstream, then use it to decode
    241 * @num_lens codeword length values.
    242 *
    243 * @is:		The input bitstream.
    244 *
    245 * @lens:	An array that contains the length values from the previous time
    246 *		the codeword lengths for this Huffman code were read, or all 0's
    247 *		if this is the first time.  This array must have at least
    248 *		(@num_lens + LZX_READ_LENS_MAX_OVERRUN) entries.
    249 *
    250 * @num_lens:	Number of length values to decode.
    251 *
    252 * Returns 0 on success, or -1 if the data was invalid.
    253 */
    254static int lzx_read_codeword_lens(struct lzx_decompressor *d,
    255				  struct input_bitstream *is,
    256				  u8 *lens, u32 num_lens)
    257{
    258	u8 *len_ptr = lens;
    259	u8 *lens_end = lens + num_lens;
    260	int i;
    261
    262	/* Read the lengths of the precode codewords.  These are given
    263	 * explicitly.
    264	 */
    265	for (i = 0; i < LZX_PRECODE_NUM_SYMBOLS; i++) {
    266		d->precode_lens[i] =
    267			bitstream_read_bits(is, LZX_PRECODE_ELEMENT_SIZE);
    268	}
    269
    270	/* Make the decoding table for the precode.  */
    271	if (make_huffman_decode_table(d->precode_decode_table,
    272				      LZX_PRECODE_NUM_SYMBOLS,
    273				      LZX_PRECODE_TABLEBITS,
    274				      d->precode_lens,
    275				      LZX_MAX_PRE_CODEWORD_LEN,
    276				      d->working_space))
    277		return -1;
    278
    279	/* Decode the codeword lengths.  */
    280	do {
    281		u32 presym;
    282		u8 len;
    283
    284		/* Read the next precode symbol.  */
    285		presym = read_presym(d, is);
    286		if (presym < 17) {
    287			/* Difference from old length  */
    288			len = *len_ptr - presym;
    289			if ((s8)len < 0)
    290				len += 17;
    291			*len_ptr++ = len;
    292		} else {
    293			/* Special RLE values  */
    294
    295			u32 run_len;
    296
    297			if (presym == 17) {
    298				/* Run of 0's  */
    299				run_len = 4 + bitstream_read_bits(is, 4);
    300				len = 0;
    301			} else if (presym == 18) {
    302				/* Longer run of 0's  */
    303				run_len = 20 + bitstream_read_bits(is, 5);
    304				len = 0;
    305			} else {
    306				/* Run of identical lengths  */
    307				run_len = 4 + bitstream_read_bits(is, 1);
    308				presym = read_presym(d, is);
    309				if (presym > 17)
    310					return -1;
    311				len = *len_ptr - presym;
    312				if ((s8)len < 0)
    313					len += 17;
    314			}
    315
    316			do {
    317				*len_ptr++ = len;
    318			} while (--run_len);
    319			/* Worst case overrun is when presym == 18,
    320			 * run_len == 20 + 31, and only 1 length was remaining.
    321			 * So LZX_READ_LENS_MAX_OVERRUN == 50.
    322			 *
    323			 * Overrun while reading the first half of maincode_lens
    324			 * can corrupt the previous values in the second half.
    325			 * This doesn't really matter because the resulting
    326			 * lengths will still be in range, and data that
    327			 * generates overruns is invalid anyway.
    328			 */
    329		}
    330	} while (len_ptr < lens_end);
    331
    332	return 0;
    333}
    334
    335/*
    336 * Read the header of an LZX block and save the block type and (uncompressed)
    337 * size in *block_type_ret and *block_size_ret, respectively.
    338 *
    339 * If the block is compressed, also update the Huffman decode @tables with the
    340 * new Huffman codes.  If the block is uncompressed, also update the match
    341 * offset @queue with the new match offsets.
    342 *
    343 * Return 0 on success, or -1 if the data was invalid.
    344 */
    345static int lzx_read_block_header(struct lzx_decompressor *d,
    346				 struct input_bitstream *is,
    347				 int *block_type_ret,
    348				 u32 *block_size_ret,
    349				 u32 recent_offsets[])
    350{
    351	int block_type;
    352	u32 block_size;
    353	int i;
    354
    355	bitstream_ensure_bits(is, 4);
    356
    357	/* The first three bits tell us what kind of block it is, and should be
    358	 * one of the LZX_BLOCKTYPE_* values.
    359	 */
    360	block_type = bitstream_pop_bits(is, 3);
    361
    362	/* Read the block size.  */
    363	if (bitstream_pop_bits(is, 1)) {
    364		block_size = LZX_DEFAULT_BLOCK_SIZE;
    365	} else {
    366		block_size = 0;
    367		block_size |= bitstream_read_bits(is, 8);
    368		block_size <<= 8;
    369		block_size |= bitstream_read_bits(is, 8);
    370	}
    371
    372	switch (block_type) {
    373
    374	case LZX_BLOCKTYPE_ALIGNED:
    375
    376		/* Read the aligned offset code and prepare its decode table.
    377		 */
    378
    379		for (i = 0; i < LZX_ALIGNEDCODE_NUM_SYMBOLS; i++) {
    380			d->alignedcode_lens[i] =
    381				bitstream_read_bits(is,
    382						    LZX_ALIGNEDCODE_ELEMENT_SIZE);
    383		}
    384
    385		if (make_huffman_decode_table(d->alignedcode_decode_table,
    386					      LZX_ALIGNEDCODE_NUM_SYMBOLS,
    387					      LZX_ALIGNEDCODE_TABLEBITS,
    388					      d->alignedcode_lens,
    389					      LZX_MAX_ALIGNED_CODEWORD_LEN,
    390					      d->working_space))
    391			return -1;
    392
    393		/* Fall though, since the rest of the header for aligned offset
    394		 * blocks is the same as that for verbatim blocks.
    395		 */
    396		fallthrough;
    397
    398	case LZX_BLOCKTYPE_VERBATIM:
    399
    400		/* Read the main code and prepare its decode table.
    401		 *
    402		 * Note that the codeword lengths in the main code are encoded
    403		 * in two parts: one part for literal symbols, and one part for
    404		 * match symbols.
    405		 */
    406
    407		if (lzx_read_codeword_lens(d, is, d->maincode_lens,
    408					   LZX_NUM_CHARS))
    409			return -1;
    410
    411		if (lzx_read_codeword_lens(d, is,
    412					   d->maincode_lens + LZX_NUM_CHARS,
    413					   LZX_MAINCODE_NUM_SYMBOLS - LZX_NUM_CHARS))
    414			return -1;
    415
    416		if (make_huffman_decode_table(d->maincode_decode_table,
    417					      LZX_MAINCODE_NUM_SYMBOLS,
    418					      LZX_MAINCODE_TABLEBITS,
    419					      d->maincode_lens,
    420					      LZX_MAX_MAIN_CODEWORD_LEN,
    421					      d->working_space))
    422			return -1;
    423
    424		/* Read the length code and prepare its decode table.  */
    425
    426		if (lzx_read_codeword_lens(d, is, d->lencode_lens,
    427					   LZX_LENCODE_NUM_SYMBOLS))
    428			return -1;
    429
    430		if (make_huffman_decode_table(d->lencode_decode_table,
    431					      LZX_LENCODE_NUM_SYMBOLS,
    432					      LZX_LENCODE_TABLEBITS,
    433					      d->lencode_lens,
    434					      LZX_MAX_LEN_CODEWORD_LEN,
    435					      d->working_space))
    436			return -1;
    437
    438		break;
    439
    440	case LZX_BLOCKTYPE_UNCOMPRESSED:
    441
    442		/* Before reading the three recent offsets from the uncompressed
    443		 * block header, the stream must be aligned on a 16-bit
    444		 * boundary.  But if the stream is *already* aligned, then the
    445		 * next 16 bits must be discarded.
    446		 */
    447		bitstream_ensure_bits(is, 1);
    448		bitstream_align(is);
    449
    450		recent_offsets[0] = bitstream_read_u32(is);
    451		recent_offsets[1] = bitstream_read_u32(is);
    452		recent_offsets[2] = bitstream_read_u32(is);
    453
    454		/* Offsets of 0 are invalid.  */
    455		if (recent_offsets[0] == 0 || recent_offsets[1] == 0 ||
    456		    recent_offsets[2] == 0)
    457			return -1;
    458		break;
    459
    460	default:
    461		/* Unrecognized block type.  */
    462		return -1;
    463	}
    464
    465	*block_type_ret = block_type;
    466	*block_size_ret = block_size;
    467	return 0;
    468}
    469
    470/* Decompress a block of LZX-compressed data.  */
    471static int lzx_decompress_block(const struct lzx_decompressor *d,
    472				struct input_bitstream *is,
    473				int block_type, u32 block_size,
    474				u8 * const out_begin, u8 *out_next,
    475				u32 recent_offsets[])
    476{
    477	u8 * const block_end = out_next + block_size;
    478	u32 ones_if_aligned = 0U - (block_type == LZX_BLOCKTYPE_ALIGNED);
    479
    480	do {
    481		u32 mainsym;
    482		u32 match_len;
    483		u32 match_offset;
    484		u32 offset_slot;
    485		u32 num_extra_bits;
    486
    487		mainsym = read_mainsym(d, is);
    488		if (mainsym < LZX_NUM_CHARS) {
    489			/* Literal  */
    490			*out_next++ = mainsym;
    491			continue;
    492		}
    493
    494		/* Match  */
    495
    496		/* Decode the length header and offset slot.  */
    497		mainsym -= LZX_NUM_CHARS;
    498		match_len = mainsym % LZX_NUM_LEN_HEADERS;
    499		offset_slot = mainsym / LZX_NUM_LEN_HEADERS;
    500
    501		/* If needed, read a length symbol to decode the full length. */
    502		if (match_len == LZX_NUM_PRIMARY_LENS)
    503			match_len += read_lensym(d, is);
    504		match_len += LZX_MIN_MATCH_LEN;
    505
    506		if (offset_slot < LZX_NUM_RECENT_OFFSETS) {
    507			/* Repeat offset  */
    508
    509			/* Note: This isn't a real LRU queue, since using the R2
    510			 * offset doesn't bump the R1 offset down to R2.  This
    511			 * quirk allows all 3 recent offsets to be handled by
    512			 * the same code.  (For R0, the swap is a no-op.)
    513			 */
    514			match_offset = recent_offsets[offset_slot];
    515			recent_offsets[offset_slot] = recent_offsets[0];
    516			recent_offsets[0] = match_offset;
    517		} else {
    518			/* Explicit offset  */
    519
    520			/* Look up the number of extra bits that need to be read
    521			 * to decode offsets with this offset slot.
    522			 */
    523			num_extra_bits = lzx_extra_offset_bits[offset_slot];
    524
    525			/* Start with the offset slot base value.  */
    526			match_offset = lzx_offset_slot_base[offset_slot];
    527
    528			/* In aligned offset blocks, the low-order 3 bits of
    529			 * each offset are encoded using the aligned offset
    530			 * code.  Otherwise, all the extra bits are literal.
    531			 */
    532
    533			if ((num_extra_bits & ones_if_aligned) >= LZX_NUM_ALIGNED_OFFSET_BITS) {
    534				match_offset +=
    535					bitstream_read_bits(is, num_extra_bits -
    536								LZX_NUM_ALIGNED_OFFSET_BITS)
    537							<< LZX_NUM_ALIGNED_OFFSET_BITS;
    538				match_offset += read_alignedsym(d, is);
    539			} else {
    540				match_offset += bitstream_read_bits(is, num_extra_bits);
    541			}
    542
    543			/* Adjust the offset.  */
    544			match_offset -= (LZX_NUM_RECENT_OFFSETS - 1);
    545
    546			/* Update the recent offsets.  */
    547			recent_offsets[2] = recent_offsets[1];
    548			recent_offsets[1] = recent_offsets[0];
    549			recent_offsets[0] = match_offset;
    550		}
    551
    552		/* Validate the match, then copy it to the current position.  */
    553
    554		if (match_len > (size_t)(block_end - out_next))
    555			return -1;
    556
    557		if (match_offset > (size_t)(out_next - out_begin))
    558			return -1;
    559
    560		out_next = lz_copy(out_next, match_len, match_offset,
    561				   block_end, LZX_MIN_MATCH_LEN);
    562
    563	} while (out_next != block_end);
    564
    565	return 0;
    566}
    567
    568/*
    569 * lzx_allocate_decompressor - Allocate an LZX decompressor
    570 *
    571 * Return the pointer to the decompressor on success, or return NULL and set
    572 * errno on failure.
    573 */
    574struct lzx_decompressor *lzx_allocate_decompressor(void)
    575{
    576	return kmalloc(sizeof(struct lzx_decompressor), GFP_NOFS);
    577}
    578
    579/*
    580 * lzx_decompress - Decompress a buffer of LZX-compressed data
    581 *
    582 * @decompressor:      A decompressor allocated with lzx_allocate_decompressor()
    583 * @compressed_data:	The buffer of data to decompress
    584 * @compressed_size:	Number of bytes of compressed data
    585 * @uncompressed_data:	The buffer in which to store the decompressed data
    586 * @uncompressed_size:	The number of bytes the data decompresses into
    587 *
    588 * Return 0 on success, or return -1 and set errno on failure.
    589 */
    590int lzx_decompress(struct lzx_decompressor *decompressor,
    591		   const void *compressed_data, size_t compressed_size,
    592		   void *uncompressed_data, size_t uncompressed_size)
    593{
    594	struct lzx_decompressor *d = decompressor;
    595	u8 * const out_begin = uncompressed_data;
    596	u8 *out_next = out_begin;
    597	u8 * const out_end = out_begin + uncompressed_size;
    598	struct input_bitstream is;
    599	u32 recent_offsets[LZX_NUM_RECENT_OFFSETS] = {1, 1, 1};
    600	int e8_status = 0;
    601
    602	init_input_bitstream(&is, compressed_data, compressed_size);
    603
    604	/* Codeword lengths begin as all 0's for delta encoding purposes.  */
    605	memset(d->maincode_lens, 0, LZX_MAINCODE_NUM_SYMBOLS);
    606	memset(d->lencode_lens, 0, LZX_LENCODE_NUM_SYMBOLS);
    607
    608	/* Decompress blocks until we have all the uncompressed data.  */
    609
    610	while (out_next != out_end) {
    611		int block_type;
    612		u32 block_size;
    613
    614		if (lzx_read_block_header(d, &is, &block_type, &block_size,
    615					  recent_offsets))
    616			goto invalid;
    617
    618		if (block_size < 1 || block_size > (size_t)(out_end - out_next))
    619			goto invalid;
    620
    621		if (block_type != LZX_BLOCKTYPE_UNCOMPRESSED) {
    622
    623			/* Compressed block  */
    624
    625			if (lzx_decompress_block(d,
    626						 &is,
    627						 block_type,
    628						 block_size,
    629						 out_begin,
    630						 out_next,
    631						 recent_offsets))
    632				goto invalid;
    633
    634			e8_status |= d->maincode_lens[0xe8];
    635			out_next += block_size;
    636		} else {
    637			/* Uncompressed block  */
    638
    639			out_next = bitstream_read_bytes(&is, out_next,
    640							block_size);
    641			if (!out_next)
    642				goto invalid;
    643
    644			if (block_size & 1)
    645				bitstream_read_byte(&is);
    646
    647			e8_status = 1;
    648		}
    649	}
    650
    651	/* Postprocess the data unless it cannot possibly contain 0xe8 bytes. */
    652	if (e8_status)
    653		lzx_postprocess(uncompressed_data, uncompressed_size);
    654
    655	return 0;
    656
    657invalid:
    658	return -1;
    659}
    660
    661/*
    662 * lzx_free_decompressor - Free an LZX decompressor
    663 *
    664 * @decompressor:       A decompressor that was allocated with
    665 *			lzx_allocate_decompressor(), or NULL.
    666 */
    667void lzx_free_decompressor(struct lzx_decompressor *decompressor)
    668{
    669	kfree(decompressor);
    670}