- kexec-tools is now distributed with tarballs of .tar.gz and .tar.xz format; .tar.bz2 are not provided anymore. - Add CONFIG_KEXEC_LZMA for selecting lzma support. Patches are updated along to: - Remove the now unnecessary patch 0004-mips_regdefs.patch. - Drop 100-reduce_size.patch because the size reduction is marginal. - Allow zlib and lzma support coexist together. This patch has been merged into upstream project. - Fix kexec-tools' configure.ac. - Fix a few compilation warnings. Size comparison of stripped binaries of kexec malta target with both zlib and lzma support enabled. - Before: 41447 - After: 42583 Signed-off-by: Yousong Zhou <yszhou4tech@gmail.com> SVN-Revision: 44437
		
			
				
	
	
		
			172 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			172 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
From d606837b56d46eb7f815b5d85f07fcc3f1555d00 Mon Sep 17 00:00:00 2001
 | 
						|
From: Yousong Zhou <yszhou4tech@gmail.com>
 | 
						|
Date: Sun, 1 Feb 2015 00:10:07 +0800
 | 
						|
Subject: [PATCH 1/5] Fix zlib/lzma decompression.
 | 
						|
 | 
						|
Let {zlib,lzma}_decompress_file() return NULL if anything wrong happened
 | 
						|
to allow the other method to have a chance to run.
 | 
						|
 | 
						|
Signed-off-by: Yousong Zhou <yszhou4tech@gmail.com>
 | 
						|
Signed-off-by: Simon Horman <horms@verge.net.au>
 | 
						|
---
 | 
						|
 kexec/lzma.c |   33 ++++++++++++++++++++++-----------
 | 
						|
 kexec/zlib.c |   57 +++++++++++++++++++++++++++++++++++----------------------
 | 
						|
 2 files changed, 57 insertions(+), 33 deletions(-)
 | 
						|
 | 
						|
diff --git a/kexec/lzma.c b/kexec/lzma.c
 | 
						|
index 939aeb3..5bfccb7 100644
 | 
						|
--- a/kexec/lzma.c
 | 
						|
+++ b/kexec/lzma.c
 | 
						|
@@ -162,13 +162,16 @@ char *lzma_decompress_file(const char *filename, off_t *r_size)
 | 
						|
 	off_t size, allocated;
 | 
						|
 	ssize_t result;
 | 
						|
 
 | 
						|
-	if (!filename) {
 | 
						|
-		*r_size = 0;
 | 
						|
-		return 0;
 | 
						|
-	}
 | 
						|
+	dbgprintf("Try LZMA decompression.\n");
 | 
						|
+
 | 
						|
+	*r_size = 0;
 | 
						|
+	if (!filename)
 | 
						|
+		return NULL;
 | 
						|
+
 | 
						|
 	fp = lzopen(filename, "rb");
 | 
						|
 	if (fp == 0) {
 | 
						|
-		die("Cannot open `%s'\n", filename);
 | 
						|
+		dbgprintf("Cannot open `%s'\n", filename);
 | 
						|
+		return NULL;
 | 
						|
 	}
 | 
						|
 	size = 0;
 | 
						|
 	allocated = 65536;
 | 
						|
@@ -183,17 +186,25 @@ char *lzma_decompress_file(const char *filename, off_t *r_size)
 | 
						|
 			if ((errno == EINTR) || (errno == EAGAIN))
 | 
						|
 				continue;
 | 
						|
 
 | 
						|
-			die ("read on %s of %ld bytes failed\n",
 | 
						|
-				filename, (allocated - size) + 0UL);
 | 
						|
+			dbgprintf("%s: read on %s of %ld bytes failed\n",
 | 
						|
+				__func__, filename, (allocated - size) + 0UL);
 | 
						|
+			break;
 | 
						|
 		}
 | 
						|
 		size += result;
 | 
						|
-	} while(result > 0);
 | 
						|
-	result = lzclose(fp);
 | 
						|
-	if (result != LZMA_OK) {
 | 
						|
-		die ("Close of %s failed\n", filename);
 | 
						|
+	} while (result > 0);
 | 
						|
+
 | 
						|
+	if (lzclose(fp) != LZMA_OK) {
 | 
						|
+		dbgprintf("%s: Close of %s failed\n", __func__, filename);
 | 
						|
+		goto fail;
 | 
						|
 	}
 | 
						|
+	if (result < 0)
 | 
						|
+		goto fail;
 | 
						|
+
 | 
						|
 	*r_size =  size;
 | 
						|
 	return buf;
 | 
						|
+fail:
 | 
						|
+	free(buf);
 | 
						|
+	return NULL;
 | 
						|
 }
 | 
						|
 #else
 | 
						|
 char *lzma_decompress_file(const char *UNUSED(filename), off_t *UNUSED(r_size))
 | 
						|
diff --git a/kexec/zlib.c b/kexec/zlib.c
 | 
						|
index d44df12..7170ac3 100644
 | 
						|
--- a/kexec/zlib.c
 | 
						|
+++ b/kexec/zlib.c
 | 
						|
@@ -15,29 +15,39 @@
 | 
						|
 #include <ctype.h>
 | 
						|
 #include <zlib.h>
 | 
						|
 
 | 
						|
+static void _gzerror(gzFile fp, int *errnum, const char **errmsg)
 | 
						|
+{
 | 
						|
+	*errmsg = gzerror(fp, errnum);
 | 
						|
+	if (*errnum == Z_ERRNO) {
 | 
						|
+		*errmsg = strerror(*errnum);
 | 
						|
+	}
 | 
						|
+}
 | 
						|
+
 | 
						|
 char *zlib_decompress_file(const char *filename, off_t *r_size)
 | 
						|
 {
 | 
						|
 	gzFile fp;
 | 
						|
 	int errnum;
 | 
						|
 	const char *msg;
 | 
						|
 	char *buf;
 | 
						|
-	off_t size, allocated;
 | 
						|
+	off_t size = 0, allocated;
 | 
						|
 	ssize_t result;
 | 
						|
 
 | 
						|
+	dbgprintf("Try gzip decompression.\n");
 | 
						|
+
 | 
						|
+	*r_size = 0;
 | 
						|
 	if (!filename) {
 | 
						|
-		*r_size = 0;
 | 
						|
-		return 0;
 | 
						|
+		return NULL;
 | 
						|
 	}
 | 
						|
 	fp = gzopen(filename, "rb");
 | 
						|
 	if (fp == 0) {
 | 
						|
-		msg = gzerror(fp, &errnum);
 | 
						|
-		if (errnum == Z_ERRNO) {
 | 
						|
-			msg = strerror(errno);
 | 
						|
-		}
 | 
						|
-		fprintf(stderr, "Cannot open `%s': %s\n", filename, msg);
 | 
						|
+		_gzerror(fp, &errnum, &msg);
 | 
						|
+		dbgprintf("Cannot open `%s': %s\n", filename, msg);
 | 
						|
+		return NULL;
 | 
						|
+	}
 | 
						|
+	if (gzdirect(fp)) {
 | 
						|
+		/* It's not in gzip format */
 | 
						|
 		return NULL;
 | 
						|
 	}
 | 
						|
-	size = 0;
 | 
						|
 	allocated = 65536;
 | 
						|
 	buf = xmalloc(allocated);
 | 
						|
 	do {
 | 
						|
@@ -49,25 +59,28 @@ char *zlib_decompress_file(const char *filename, off_t *r_size)
 | 
						|
 		if (result < 0) {
 | 
						|
 			if ((errno == EINTR) || (errno == EAGAIN))
 | 
						|
 				continue;
 | 
						|
-
 | 
						|
-			msg = gzerror(fp, &errnum);
 | 
						|
-			if (errnum == Z_ERRNO) {
 | 
						|
-				msg = strerror(errno);
 | 
						|
-			}
 | 
						|
-			die ("read on %s of %ld bytes failed: %s\n",
 | 
						|
-				filename, (allocated - size) + 0UL, msg);
 | 
						|
+			_gzerror(fp, &errnum, &msg);
 | 
						|
+			dbgprintf("Read on %s of %ld bytes failed: %s\n",
 | 
						|
+					filename, (allocated - size) + 0UL, msg);
 | 
						|
+			size = 0;
 | 
						|
+			goto fail;
 | 
						|
 		}
 | 
						|
 		size += result;
 | 
						|
 	} while(result > 0);
 | 
						|
+
 | 
						|
+fail:
 | 
						|
 	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);
 | 
						|
+		_gzerror(fp, &errnum, &msg);
 | 
						|
+		dbgprintf(" Close of %s failed: %s\n", filename, msg);
 | 
						|
+	}
 | 
						|
+
 | 
						|
+	if (size > 0) {
 | 
						|
+		*r_size = size;
 | 
						|
+	} else {
 | 
						|
+		free(buf);
 | 
						|
+		buf = NULL;
 | 
						|
 	}
 | 
						|
-	*r_size =  size;
 | 
						|
 	return buf;
 | 
						|
 }
 | 
						|
 #else
 | 
						|
-- 
 | 
						|
1.7.10.4
 | 
						|
 |