diff options
Diffstat (limited to 'lib/decompress_unlzo.c')
| -rw-r--r-- | lib/decompress_unlzo.c | 22 | 
1 files changed, 15 insertions, 7 deletions
diff --git a/lib/decompress_unlzo.c b/lib/decompress_unlzo.c index db521f45626..bcb3a4bd68f 100644 --- a/lib/decompress_unlzo.c +++ b/lib/decompress_unlzo.c @@ -97,7 +97,7 @@ STATIC inline int INIT unlzo(u8 *input, int in_len,  	u32 src_len, dst_len;  	size_t tmp;  	u8 *in_buf, *in_buf_save, *out_buf; -	int obytes_processed = 0; +	int ret = -1;  	set_error_fn(error_fn); @@ -174,15 +174,22 @@ STATIC inline int INIT unlzo(u8 *input, int in_len,  		/* decompress */  		tmp = dst_len; -		r = lzo1x_decompress_safe((u8 *) in_buf, src_len, + +		/* When the input data is not compressed at all, +		 * lzo1x_decompress_safe will fail, so call memcpy() +		 * instead */ +		if (unlikely(dst_len == src_len)) +			memcpy(out_buf, in_buf, src_len); +		else { +			r = lzo1x_decompress_safe((u8 *) in_buf, src_len,  						out_buf, &tmp); -		if (r != LZO_E_OK || dst_len != tmp) { -			error("Compressed data violation"); -			goto exit_2; +			if (r != LZO_E_OK || dst_len != tmp) { +				error("Compressed data violation"); +				goto exit_2; +			}  		} -		obytes_processed += dst_len;  		if (flush)  			flush(out_buf, dst_len);  		if (output) @@ -196,6 +203,7 @@ STATIC inline int INIT unlzo(u8 *input, int in_len,  			in_buf += src_len;  	} +	ret = 0;  exit_2:  	if (!input)  		free(in_buf); @@ -203,7 +211,7 @@ exit_1:  	if (!output)  		free(out_buf);  exit: -	return obytes_processed; +	return ret;  }  #define decompress unlzo  |