Commit b1af4315 authored by Phillip Lougher's avatar Phillip Lougher Committed by Linus Torvalds

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: default avatarPhillip Lougher <phillip@lougher.demon.co.uk>
Cc: "H. Peter Anvin" <hpa@zytor.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent daeb6b6f
...@@ -45,9 +45,11 @@ ...@@ -45,9 +45,11 @@
*/ */
#ifndef STATIC #ifdef STATIC
#define PREBOOT
#else
#include <linux/decompress/bunzip2.h> #include <linux/decompress/bunzip2.h>
#endif /* !STATIC */ #endif /* STATIC */
#include <linux/decompress/mm.h> #include <linux/decompress/mm.h>
#include <linux/slab.h> #include <linux/slab.h>
...@@ -681,9 +683,7 @@ STATIC int INIT bunzip2(unsigned char *buf, int len, ...@@ -681,9 +683,7 @@ STATIC int INIT bunzip2(unsigned char *buf, int len,
set_error_fn(error_fn); set_error_fn(error_fn);
if (flush) if (flush)
outbuf = malloc(BZIP2_IOBUF_SIZE); outbuf = malloc(BZIP2_IOBUF_SIZE);
else
len -= 4; /* Uncompressed size hack active in pre-boot
environment */
if (!outbuf) { if (!outbuf) {
error("Could not allocate output bufer"); error("Could not allocate output bufer");
return -1; return -1;
...@@ -733,4 +733,14 @@ exit_0: ...@@ -733,4 +733,14 @@ exit_0:
return i; 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
...@@ -29,7 +29,9 @@ ...@@ -29,7 +29,9 @@
*Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/ */
#ifndef STATIC #ifdef STATIC
#define PREBOOT
#else
#include <linux/decompress/unlzma.h> #include <linux/decompress/unlzma.h>
#endif /* STATIC */ #endif /* STATIC */
...@@ -543,9 +545,7 @@ STATIC inline int INIT unlzma(unsigned char *buf, int in_len, ...@@ -543,9 +545,7 @@ STATIC inline int INIT unlzma(unsigned char *buf, int in_len,
int ret = -1; int ret = -1;
set_error_fn(error_fn); set_error_fn(error_fn);
if (!flush)
in_len -= 4; /* Uncompressed size hack active in pre-boot
environment */
if (buf) if (buf)
inbuf = buf; inbuf = buf;
else else
...@@ -645,4 +645,15 @@ exit_0: ...@@ -645,4 +645,15 @@ exit_0:
return ret; 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
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment