From 12e7f4e2f9e3254e97a67cfb2b77bbb0d166a2f2 Mon Sep 17 00:00:00 2001 From: Eric Biggers Date: Mon, 20 Jul 2015 00:02:07 -0500 Subject: [PATCH] decompress_common.h: make bitstream_read_bytes() fill buffer itself --- include/wimlib/decompress_common.h | 17 +++++++++-------- src/lzx_decompress.c | 12 ++++-------- 2 files changed, 13 insertions(+), 16 deletions(-) diff --git a/include/wimlib/decompress_common.h b/include/wimlib/decompress_common.h index ce731dca..70f7dd5a 100644 --- a/include/wimlib/decompress_common.h +++ b/include/wimlib/decompress_common.h @@ -10,6 +10,8 @@ #ifndef _WIMLIB_DECOMPRESS_COMMON_H #define _WIMLIB_DECOMPRESS_COMMON_H +#include + #include "wimlib/compiler.h" #include "wimlib/types.h" #include "wimlib/unaligned.h" @@ -157,18 +159,17 @@ bitstream_read_u32(struct input_bitstream *is) return v; } -/* Read an array of literal bytes embedded in the bitstream. Return a pointer - * to the resulting array, or NULL if the read overflows the input buffer. */ -static inline const u8 * -bitstream_read_bytes(struct input_bitstream *is, size_t count) +/* Read into @dst_buffer an array of literal bytes embedded in the bitstream. + * Return either a pointer to the byte past the last written, or NULL if the + * read overflows the input buffer. */ +static inline void * +bitstream_read_bytes(struct input_bitstream *is, void *dst_buffer, size_t count) { - const u8 *p; - if (unlikely(is->end - is->next < count)) return NULL; - p = is->next; + memcpy(dst_buffer, is->next, count); is->next += count; - return p; + return (u8 *)dst_buffer + count; } /* Align the input bitstream on a coding-unit boundary. */ diff --git a/src/lzx_decompress.c b/src/lzx_decompress.c index 1ebaf351..d9ab5c33 100644 --- a/src/lzx_decompress.c +++ b/src/lzx_decompress.c @@ -583,17 +583,15 @@ lzx_decompress(const void *compressed_data, size_t compressed_size, * have been encoded as a literal using mainsym 0xe8. */ if (dec->tables.maincode_lens[0xe8] != 0) may_have_e8_byte = true; + + out_next += block_size; } else { /* Uncompressed block. */ - const u8 *p; - - p = bitstream_read_bytes(&istream, block_size); - if (!p) + out_next = bitstream_read_bytes(&istream, out_next, block_size); + if (!out_next) return -1; - memcpy(out_next, p, block_size); - /* Re-align the bitstream if an odd number of bytes was * read. */ if (block_size & 1) @@ -601,8 +599,6 @@ lzx_decompress(const void *compressed_data, size_t compressed_size, may_have_e8_byte = true; } - - out_next += block_size; } /* Postprocess the data unless it cannot possibly contain 0xe8 bytes */ -- 2.43.0