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>
This commit is contained in:
parent
daeb6b6fbe
commit
b1af4315d8
|
@ -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 *buf, int len,
|
|||
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
|
||||
|
|
|
@ -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 char *buf, int in_len,
|
|||
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
|
||||
|
|
Loading…
Reference in New Issue