lib: fix the use of LZO to decompress initramfs images

Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]
From: Linux Kernel Mailing List
Date: Saturday, April 24, 2010 - 3:59 pm

Gitweb:     http://git.kernel.org/linus/ccdb40048b2972f10bdc944913c0e0ee26b5d1f2
Commit:     ccdb40048b2972f10bdc944913c0e0ee26b5d1f2
Parent:     23be7468e8802a2ac1de6ee3eecb3ec7f14dc703
Author:     Albin Tonnerre <albin.tonnerre@free-electrons.com>
AuthorDate: Fri Apr 23 13:17:58 2010 -0400
Committer:  Linus Torvalds <torvalds@linux-foundation.org>
CommitDate: Sat Apr 24 11:31:25 2010 -0700

    lib: fix the use of LZO to decompress initramfs images
    
    This patch fixes 2 issues with the LZO decompressor:
    
    - It doesn't handle the case where a block isn't compressed at all.  In
      this case, calling lzo1x_decompress_safe will fail, so we need to just
      use memcpy() instead (the upstream LZO code does something similar)
    
    - Since commit 54291362d2a5738e1b0495df2abcb9e6b0563a3f ("initramfs: add
      missing decompressor error check") , the decompressor return code is
      checked in the init/initramfs.c The LZO decompressor didn't return the
      expected value, causing the initramfs code to falsely believe a
      decompression error occured
    
    Signed-off-by: Albin Tonnerre <albin.tonnerre@free-electrons.com>
    Tested-by: bert schulze <spambemyguest@googlemail.com>
    Cc: "H. Peter Anvin" <hpa@zytor.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
---
 lib/decompress_unlzo.c |   22 +++++++++++++++-------
 1 files changed, 15 insertions(+), 7 deletions(-)

diff --git a/lib/decompress_unlzo.c b/lib/decompress_unlzo.c
index db521f4..bcb3a4b 100644
--- a/lib/decompress_unlzo.c
+++ b/lib/decompress_unlzo.c
@@ -97,7 +97,7 @@ STATIC inline int INIT unlzo(u8 *input, int in_len,
 	u32 src_len, dst_len;
 	size_t tmp;
 	u8 *in_buf, *in_buf_save, *out_buf;
-	int obytes_processed = 0;
+	int ret = -1;
 
 	set_error_fn(error_fn);
 
@@ -174,15 +174,22 @@ STATIC inline int INIT unlzo(u8 *input, int in_len,
 
 		/* decompress */
 		tmp = dst_len;
-		r = lzo1x_decompress_safe((u8 *) in_buf, src_len,
+
+		/* When the input data is not compressed at all,
+		 * lzo1x_decompress_safe will fail, so call memcpy()
+		 * instead */
+		if (unlikely(dst_len == src_len))
+			memcpy(out_buf, in_buf, src_len);
+		else {
+			r = lzo1x_decompress_safe((u8 *) in_buf, src_len,
 						out_buf, &tmp);
 
-		if (r != LZO_E_OK || dst_len != tmp) {
-			error("Compressed data violation");
-			goto exit_2;
+			if (r != LZO_E_OK || dst_len != tmp) {
+				error("Compressed data violation");
+				goto exit_2;
+			}
 		}
 
-		obytes_processed += dst_len;
 		if (flush)
 			flush(out_buf, dst_len);
 		if (output)
@@ -196,6 +203,7 @@ STATIC inline int INIT unlzo(u8 *input, int in_len,
 			in_buf += src_len;
 	}
 
+	ret = 0;
 exit_2:
 	if (!input)
 		free(in_buf);
@@ -203,7 +211,7 @@ exit_1:
 	if (!output)
 		free(out_buf);
 exit:
-	return obytes_processed;
+	return ret;
 }
 
 #define decompress unlzo
--
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]

Messages in current thread:
lib: fix the use of LZO to decompress initramfs images, Linux Kernel Mailing ..., (Sat Apr 24, 3:59 pm)