lib: fdt: Allow enabling both LZO and GZIP DT compression
authorMarek Vasut <marek.vasut+renesas@gmail.com>
Wed, 13 Mar 2019 20:11:22 +0000 (21:11 +0100)
committerMarek Vasut <marex@denx.de>
Tue, 9 Apr 2019 16:19:10 +0000 (18:19 +0200)
Allow enabling both LZO and GZIP DT compression in SPL and fix a
bug where if the GZIP decompression failed, the LZO decompression
would not even be attempted.

Signed-off-by: Marek Vasut <marek.vasut+renesas@gmail.com>
Cc: Nobuhiro Iwamatsu <iwamatsu@nigauri.org>
Cc: Simon Glass <sjg@chromium.org>
Cc: Tom Rini <trini@konsulko.com>
lib/fdtdec.c

index 79915b59bdffe99557c48ab29abbd7620c721695..d5e8b5a4200b15690ec8be333d7ab2a1644bf2e4 100644 (file)
@@ -1183,16 +1183,21 @@ int fdtdec_setup_memory_banksize(void)
 static int uncompress_blob(const void *src, ulong sz_src, void **dstp)
 {
        size_t sz_out = CONFIG_SPL_MULTI_DTB_FIT_UNCOMPRESS_SZ;
+       bool gzip = 0, lzo = 0;
        ulong sz_in = sz_src;
        void *dst;
        int rc;
 
        if (CONFIG_IS_ENABLED(GZIP))
-               if (gzip_parse_header(src, sz_in) < 0)
-                       return -1;
+               if (gzip_parse_header(src, sz_in) >= 0)
+                       gzip = 1;
        if (CONFIG_IS_ENABLED(LZO))
-               if (!lzop_is_valid_header(src))
-                       return -EBADMSG;
+               if (!gzip && lzop_is_valid_header(src))
+                       lzo = 1;
+
+       if (!gzip && !lzo)
+               return -EBADMSG;
+
 
        if (CONFIG_IS_ENABLED(MULTI_DTB_FIT_DYN_ALLOC)) {
                dst = malloc(sz_out);
@@ -1208,10 +1213,12 @@ static int uncompress_blob(const void *src, ulong sz_src, void **dstp)
 #  endif
        }
 
-       if (CONFIG_IS_ENABLED(GZIP))
+       if (CONFIG_IS_ENABLED(GZIP) && gzip)
                rc = gunzip(dst, sz_out, (u8 *)src, &sz_in);
-       else if (CONFIG_IS_ENABLED(LZO))
+       else if (CONFIG_IS_ENABLED(LZO) && lzo)
                rc = lzop_decompress(src, sz_in, dst, &sz_out);
+       else
+               hang();
 
        if (rc < 0) {
                /* not a valid compressed blob */