mirror of
git://projects.qi-hardware.com/openwrt-xburst.git
synced 2024-12-01 01:16:15 +02:00
c5552ad039
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@21952 3c298f89-4303-0410-b956-a3cf2f4a3e73
114 lines
3.2 KiB
Diff
114 lines
3.2 KiB
Diff
From b1af4315d823a2b6659c5b14bc17f7bc61878ef4 Mon Sep 17 00:00:00 2001
|
|
From: Phillip Lougher <phillip@lougher.demon.co.uk>
|
|
Date: Thu, 6 Aug 2009 15:09:31 -0700
|
|
Subject: [PATCH] bzip2/lzma: remove nasty uncompressed size hack in pre-boot environment
|
|
|
|
decompress_bunzip2 and decompress_unlzma have a nasty hack that subtracts
|
|
4 from the input length if being called in the pre-boot environment.
|
|
|
|
This is a nasty hack because it relies on the fact that flush = NULL only
|
|
when called from the pre-boot environment (i.e.
|
|
arch/x86/boot/compressed/misc.c). initramfs.c/do_mounts_rd.c pass in a
|
|
flush buffer (flush != NULL).
|
|
|
|
This hack prevents the decompressors from being used with flush = NULL by
|
|
other callers unless knowledge of the hack is propagated to them.
|
|
|
|
This patch removes the hack by making decompress (called only from the
|
|
pre-boot environment) a wrapper function that subtracts 4 from the input
|
|
length before calling the decompressor.
|
|
|
|
Signed-off-by: Phillip Lougher <phillip@lougher.demon.co.uk>
|
|
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_bunzip2.c | 22 ++++++++++++++++------
|
|
lib/decompress_unlzma.c | 21 ++++++++++++++++-----
|
|
2 files changed, 32 insertions(+), 11 deletions(-)
|
|
|
|
--- a/lib/decompress_bunzip2.c
|
|
+++ b/lib/decompress_bunzip2.c
|
|
@@ -45,9 +45,11 @@
|
|
*/
|
|
|
|
|
|
-#ifndef STATIC
|
|
+#ifdef STATIC
|
|
+#define PREBOOT
|
|
+#else
|
|
#include <linux/decompress/bunzip2.h>
|
|
-#endif /* !STATIC */
|
|
+#endif /* STATIC */
|
|
|
|
#include <linux/decompress/mm.h>
|
|
#include <linux/slab.h>
|
|
@@ -681,9 +683,7 @@ STATIC int INIT bunzip2(unsigned char *b
|
|
set_error_fn(error_fn);
|
|
if (flush)
|
|
outbuf = malloc(BZIP2_IOBUF_SIZE);
|
|
- else
|
|
- len -= 4; /* Uncompressed size hack active in pre-boot
|
|
- environment */
|
|
+
|
|
if (!outbuf) {
|
|
error("Could not allocate output bufer");
|
|
return -1;
|
|
@@ -733,4 +733,14 @@ exit_0:
|
|
return i;
|
|
}
|
|
|
|
-#define decompress bunzip2
|
|
+#ifdef PREBOOT
|
|
+STATIC int INIT decompress(unsigned char *buf, int len,
|
|
+ int(*fill)(void*, unsigned int),
|
|
+ int(*flush)(void*, unsigned int),
|
|
+ unsigned char *outbuf,
|
|
+ int *pos,
|
|
+ void(*error_fn)(char *x))
|
|
+{
|
|
+ return bunzip2(buf, len - 4, fill, flush, outbuf, pos, error_fn);
|
|
+}
|
|
+#endif
|
|
--- a/lib/decompress_unlzma.c
|
|
+++ b/lib/decompress_unlzma.c
|
|
@@ -29,7 +29,9 @@
|
|
*Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
*/
|
|
|
|
-#ifndef STATIC
|
|
+#ifdef STATIC
|
|
+#define PREBOOT
|
|
+#else
|
|
#include <linux/decompress/unlzma.h>
|
|
#endif /* STATIC */
|
|
|
|
@@ -543,9 +545,7 @@ STATIC inline int INIT unlzma(unsigned c
|
|
int ret = -1;
|
|
|
|
set_error_fn(error_fn);
|
|
- if (!flush)
|
|
- in_len -= 4; /* Uncompressed size hack active in pre-boot
|
|
- environment */
|
|
+
|
|
if (buf)
|
|
inbuf = buf;
|
|
else
|
|
@@ -645,4 +645,15 @@ exit_0:
|
|
return ret;
|
|
}
|
|
|
|
-#define decompress unlzma
|
|
+#ifdef PREBOOT
|
|
+STATIC int INIT decompress(unsigned char *buf, int in_len,
|
|
+ int(*fill)(void*, unsigned int),
|
|
+ int(*flush)(void*, unsigned int),
|
|
+ unsigned char *output,
|
|
+ int *posp,
|
|
+ void(*error_fn)(char *x)
|
|
+ )
|
|
+{
|
|
+ return unlzma(buf, in_len - 4, fill, flush, output, posp, error_fn);
|
|
+}
|
|
+#endif
|