diff --git a/include/linux/lzo.h b/include/linux/lzo.h index 88687faba1..8981d04f96 100644 --- a/include/linux/lzo.h +++ b/include/linux/lzo.h @@ -31,6 +31,9 @@ int lzo1x_decompress_safe(const unsigned char *src, size_t src_len, int lzop_decompress(const unsigned char *src, size_t src_len, unsigned char *dst, size_t *dst_len); +/* check if the header is valid (based on magic numbers) */ +bool lzop_is_valid_header(const unsigned char *src); + /* * Return values (< 0 = Error) */ diff --git a/lib/lzo/lzo1x_decompress.c b/lib/lzo/lzo1x_decompress.c index ccc90b8ee5..65fef0b0eb 100644 --- a/lib/lzo/lzo1x_decompress.c +++ b/lib/lzo/lzo1x_decompress.c @@ -30,16 +30,29 @@ static const unsigned char lzop_magic[] = { #define HEADER_HAS_FILTER 0x00000800L + +bool lzop_is_valid_header(const unsigned char *src) +{ + int i; + /* read magic: 9 first bytes */ + for (i = 0; i < ARRAY_SIZE(lzop_magic); i++) { + if (*src++ != lzop_magic[i]) + return false; + } + return true; +} + static inline const unsigned char *parse_header(const unsigned char *src) { u16 version; int i; - /* read magic: 9 first bytes */ - for (i = 0; i < ARRAY_SIZE(lzop_magic); i++) { - if (*src++ != lzop_magic[i]) - return NULL; - } + if (!lzop_is_valid_header(src)) + return NULL; + + /* skip header */ + src += 9; + /* get version (2bytes), skip library version (2), * 'need to be extracted' version (2) and * method (1) */