efi_loader: put device tree into EfiACPIReclaimMemory
[oweals/u-boot.git] / lib / lzo / lzo1x_decompress.c
index ebdf10b988de5964bb7769f2433ab91d8d99bffa..65fef0b0eb90591d2c03e6acaf8c267e7b2c9021 100644 (file)
@@ -30,16 +30,29 @@ static const unsigned char lzop_magic[] = {
 
 #define HEADER_HAS_FILTER      0x00000800L
 
-static inline const unsigned char *parse_header(const unsigned char *src)
+
+bool lzop_is_valid_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;
+                       return false;
        }
+       return true;
+}
+
+static inline const unsigned char *parse_header(const unsigned char *src)
+{
+       u16 version;
+       int i;
+
+       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) */
@@ -98,18 +111,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;