]> git.sur5r.net Git - u-boot/blobdiff - lib/lzo/lzo1x_decompress.c
ARM64: zynqmp: Adjust to new SMC interface to get silicon version
[u-boot] / lib / lzo / lzo1x_decompress.c
index 09bdc8f6ca00324f8b7ec331da7ca58709e42bb9..ccc90b8ee53fe8097d26f20d31b34dface2413b1 100644 (file)
@@ -32,7 +32,6 @@ static const unsigned char lzop_magic[] = {
 
 static inline const unsigned char *parse_header(const unsigned char *src)
 {
-       u8 level = 0;
        u16 version;
        int i;
 
@@ -47,7 +46,7 @@ static inline const unsigned char *parse_header(const unsigned char *src)
        version = get_unaligned_be16(src);
        src += 7;
        if (version >= 0x0940)
-               level = *src++;
+               src++;
        if (get_unaligned_be32(src) & HEADER_HAS_FILTER)
                src += 4; /* filter info */
 
@@ -69,13 +68,14 @@ int lzop_decompress(const unsigned char *src, size_t src_len,
        unsigned char *start = dst;
        const unsigned char *send = src + src_len;
        u32 slen, dlen;
-       size_t tmp;
+       size_t tmp, remaining;
        int r;
 
        src = parse_header(src);
        if (!src)
                return LZO_E_ERROR;
 
+       remaining = *dst_len;
        while (src < send) {
                /* read uncompressed block size */
                dlen = get_unaligned_be32(src);
@@ -94,18 +94,32 @@ int lzop_decompress(const unsigned char *src, size_t src_len,
                if (slen <= 0 || slen > dlen)
                        return LZO_E_ERROR;
 
-               /* decompress */
-               tmp = dlen;
-               r = lzo1x_decompress_safe((u8 *) src, slen, dst, &tmp);
-
-               if (r != LZO_E_OK)
-                       return r;
+               /* abort if buffer ran out of room */
+               if (dlen > remaining)
+                       return LZO_E_OUTPUT_OVERRUN;
+
+               /* 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 (dlen != tmp)
-                       return LZO_E_ERROR;
+                       if (dlen != tmp)
+                               return LZO_E_ERROR;
+               }
 
                src += slen;
                dst += dlen;
+               remaining -= dlen;
        }
 
        return LZO_E_INPUT_OVERRUN;