Let {zlib,lzma}_decompress_file() return NULL if anything wrong happened
thus to allow other decompression methods have a chance to try.

Signed-off-by: Yousong Zhou <[email protected]>
---
 .../patches/102-fix-zlib-lzma-decompress.patch     |  101 ++++++++++++++++++++
 1 file changed, 101 insertions(+)
 create mode 100644 
package/boot/kexec-tools/patches/102-fix-zlib-lzma-decompress.patch

diff --git 
a/package/boot/kexec-tools/patches/102-fix-zlib-lzma-decompress.patch 
b/package/boot/kexec-tools/patches/102-fix-zlib-lzma-decompress.patch
new file mode 100644
index 0000000..d39685e
--- /dev/null
+++ b/package/boot/kexec-tools/patches/102-fix-zlib-lzma-decompress.patch
@@ -0,0 +1,101 @@
+--- a/kexec/lzma.c
++++ b/kexec/lzma.c
+@@ -168,7 +168,8 @@ char *lzma_decompress_file(const char *f
+       }
+       fp = lzopen(filename, "rb");
+       if (fp == 0) {
+-              die("Cannot open `%s'\n", filename);
++              fprintf(stderr, "Cannot open `%s'\n", filename);
++              return NULL;
+       }
+       size = 0;
+       allocated = 65536;
+@@ -183,16 +184,25 @@ char *lzma_decompress_file(const char *f
+                       if ((errno == EINTR) || (errno == EAGAIN))
+                               continue;
+ 
+-                      die ("read on %s of %ld bytes failed\n",
+-                              filename, (allocated - size) + 0UL);
++                      fprintf(stderr, "%s: read on %s of %ld bytes failed\n",
++                              __func__, filename, (allocated - size) + 0UL);
++                      size = 0;
++                      break;
+               }
+               size += result;
+       } while(result > 0);
++
+       result = lzclose(fp);
+       if (result != LZMA_OK) {
+-              die ("Close of %s failed\n", filename);
++              fprintf(stderr, "%s: Close of %s failed\n", __func__, filename);
++              size = 0;
+       }
++
+       *r_size =  size;
++      if (size == 0) {
++              free(buf);
++              return NULL;
++      }
+       return buf;
+ }
+ #else
+--- a/kexec/zlib.c
++++ b/kexec/zlib.c
+@@ -37,6 +37,10 @@ char *zlib_decompress_file(const char *f
+               fprintf(stderr, "Cannot open `%s': %s\n", filename, msg);
+               return NULL;
+       }
++      if (gzdirect(fp)) {
++              fprintf(stderr, "`%s' is not in gzip format: %s\n", filename);
++              return NULL;
++      }
+       size = 0;
+       allocated = 65536;
+       buf = xmalloc(allocated);
+@@ -46,7 +50,7 @@ char *zlib_decompress_file(const char *f
+                       buf = xrealloc(buf, allocated);
+               }
+               result = gzread(fp, buf + size, allocated - size);
+-              if (result < 0) {
++              if (result <= 0) {
+                       if ((errno == EINTR) || (errno == EAGAIN))
+                               continue;
+ 
+@@ -54,20 +58,33 @@ char *zlib_decompress_file(const char *f
+                       if (errnum == Z_ERRNO) {
+                               msg = strerror(errno);
+                       }
+-                      die ("read on %s of %ld bytes failed: %s\n",
+-                              filename, (allocated - size) + 0UL, msg);
++                      if (errnum != Z_OK) {
++                              fprintf(stderr, "%s: read on %s of %ld bytes 
failed with %d: %s\n",
++                                      __func__, filename, (allocated - size) 
+ 0UL, errnum, msg);
++                              size = 0;
++                              break;
++                      }
+               }
+               size += result;
+       } while(result > 0);
++
+       result = gzclose(fp);
+       if (result != Z_OK) {
+               msg = gzerror(fp, &errnum);
+               if (errnum == Z_ERRNO) {
+                       msg = strerror(errno);
+               }
+-              die ("Close of %s failed: %s\n", filename, msg);
++              fprintf(stderr, "%s: Close of %s failed with %d: %s\n",
++                      __func__, filename, errnum, msg);
++              size = 0;
+       }
+-      *r_size =  size;
++
++      *r_size = size;
++      if (size == 0) {
++              free(buf);
++              return NULL;
++      }
++
+       return buf;
+ }
+ #else
-- 
1.7.10.4
_______________________________________________
openwrt-devel mailing list
[email protected]
https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel

Reply via email to