diff --git a/lib/lzo/lzo1x_decompress.c b/lib/lzo/lzo1x_decompress.c index ebdf10b988de5964bb7769f2433ab91d8d99bffa..ccc90b8ee53fe8097d26f20d31b34dface2413b1 100644 --- a/lib/lzo/lzo1x_decompress.c +++ b/lib/lzo/lzo1x_decompress.c @@ -98,18 +98,25 @@ int lzop_decompress(const unsigned char *src, size_t src_len, if (dlen > remaining) return LZO_E_OUTPUT_OVERRUN; - /* decompress */ - tmp = dlen; - r = lzo1x_decompress_safe((u8 *) src, slen, dst, &tmp); + /* When the input data is not compressed at all, + * lzo1x_decompress_safe will fail, so call memcpy() + * instead */ + if (dlen == slen) { + memcpy(dst, src, slen); + } else { + /* decompress */ + tmp = dlen; + r = lzo1x_decompress_safe((u8 *)src, slen, dst, &tmp); + + if (r != LZO_E_OK) { + *dst_len = dst - start; + return r; + } - if (r != LZO_E_OK) { - *dst_len = dst - start; - return r; + if (dlen != tmp) + return LZO_E_ERROR; } - if (dlen != tmp) - return LZO_E_ERROR; - src += slen; dst += dlen; remaining -= dlen;