Commit ccc1c7c6 authored by Nicolas Pitre's avatar Nicolas Pitre
Browse files

ARM: zImage: don't ignore error returned from decompress()



If decompress() returns an error without calling error(), we must
not attempt to boot the resulting kernel.

Signed-off-by: default avatarNicolas Pitre <nicolas.pitre@linaro.org>
Tested-by: default avatarShawn Guo <shawn.guo@linaro.org>
Tested-by: default avatarTony Lindgren <tony@atomide.com>
parent e40f1e9f
Loading
Loading
Loading
Loading
+2 −2
Original line number Original line Diff line number Diff line
@@ -44,7 +44,7 @@ extern void error(char *);
#include "../../../../lib/decompress_unlzma.c"
#include "../../../../lib/decompress_unlzma.c"
#endif
#endif


void do_decompress(u8 *input, int len, u8 *output, void (*error)(char *x))
int do_decompress(u8 *input, int len, u8 *output, void (*error)(char *x))
{
{
	decompress(input, len, NULL, NULL, output, NULL, error);
	return decompress(input, len, NULL, NULL, output, NULL, error);
}
}
+9 −4
Original line number Original line Diff line number Diff line
@@ -177,7 +177,7 @@ asmlinkage void __div0(void)
	error("Attempting division by 0!");
	error("Attempting division by 0!");
}
}


extern void do_decompress(u8 *input, int len, u8 *output, void (*error)(char *x));
extern int do_decompress(u8 *input, int len, u8 *output, void (*error)(char *x));




void
void
@@ -185,6 +185,8 @@ decompress_kernel(unsigned long output_start, unsigned long free_mem_ptr_p,
		unsigned long free_mem_ptr_end_p,
		unsigned long free_mem_ptr_end_p,
		int arch_id)
		int arch_id)
{
{
	int ret;

	output_data		= (unsigned char *)output_start;
	output_data		= (unsigned char *)output_start;
	free_mem_ptr		= free_mem_ptr_p;
	free_mem_ptr		= free_mem_ptr_p;
	free_mem_end_ptr	= free_mem_ptr_end_p;
	free_mem_end_ptr	= free_mem_ptr_end_p;
@@ -193,7 +195,10 @@ decompress_kernel(unsigned long output_start, unsigned long free_mem_ptr_p,
	arch_decomp_setup();
	arch_decomp_setup();


	putstr("Uncompressing Linux...");
	putstr("Uncompressing Linux...");
	do_decompress(input_data, input_data_end - input_data,
	ret = do_decompress(input_data, input_data_end - input_data,
			    output_data, error);
			    output_data, error);
	if (ret)
		error("decompressor returned an error");
	else
		putstr(" done, booting the kernel.\n");
		putstr(" done, booting the kernel.\n");
}
}