diff options
| author | Nicolas Pitre <nicolas.pitre@linaro.org> | 2011-04-21 21:59:49 -0400 |
|---|---|---|
| committer | Nicolas Pitre <nico@fluxnic.net> | 2011-05-07 00:08:01 -0400 |
| commit | ccc1c7c6c25661f0071a7ebe997abcbf529df3e9 (patch) | |
| tree | a879518e3e9d70521d0ac1103ec3bbbd2a2b7aba | |
| parent | e40f1e9fb342a2e38fae164861a8cff248ceb87b (diff) | |
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: Nicolas Pitre <nicolas.pitre@linaro.org>
Tested-by: Shawn Guo <shawn.guo@linaro.org>
Tested-by: Tony Lindgren <tony@atomide.com>
| -rw-r--r-- | arch/arm/boot/compressed/decompress.c | 4 | ||||
| -rw-r--r-- | arch/arm/boot/compressed/misc.c | 13 |
2 files changed, 11 insertions, 6 deletions
diff --git a/arch/arm/boot/compressed/decompress.c b/arch/arm/boot/compressed/decompress.c index 4c72a97bc3e1..07be5a2f8302 100644 --- a/arch/arm/boot/compressed/decompress.c +++ b/arch/arm/boot/compressed/decompress.c | |||
| @@ -44,7 +44,7 @@ extern void error(char *); | |||
| 44 | #include "../../../../lib/decompress_unlzma.c" | 44 | #include "../../../../lib/decompress_unlzma.c" |
| 45 | #endif | 45 | #endif |
| 46 | 46 | ||
| 47 | void do_decompress(u8 *input, int len, u8 *output, void (*error)(char *x)) | 47 | int do_decompress(u8 *input, int len, u8 *output, void (*error)(char *x)) |
| 48 | { | 48 | { |
| 49 | decompress(input, len, NULL, NULL, output, NULL, error); | 49 | return decompress(input, len, NULL, NULL, output, NULL, error); |
| 50 | } | 50 | } |
diff --git a/arch/arm/boot/compressed/misc.c b/arch/arm/boot/compressed/misc.c index 51b87b54a7ef..65871a7ba0d7 100644 --- a/arch/arm/boot/compressed/misc.c +++ b/arch/arm/boot/compressed/misc.c | |||
| @@ -177,7 +177,7 @@ asmlinkage void __div0(void) | |||
| 177 | error("Attempting division by 0!"); | 177 | error("Attempting division by 0!"); |
| 178 | } | 178 | } |
| 179 | 179 | ||
| 180 | extern void do_decompress(u8 *input, int len, u8 *output, void (*error)(char *x)); | 180 | extern int do_decompress(u8 *input, int len, u8 *output, void (*error)(char *x)); |
| 181 | 181 | ||
| 182 | 182 | ||
| 183 | void | 183 | void |
| @@ -185,6 +185,8 @@ decompress_kernel(unsigned long output_start, unsigned long free_mem_ptr_p, | |||
| 185 | unsigned long free_mem_ptr_end_p, | 185 | unsigned long free_mem_ptr_end_p, |
| 186 | int arch_id) | 186 | int arch_id) |
| 187 | { | 187 | { |
| 188 | int ret; | ||
| 189 | |||
| 188 | output_data = (unsigned char *)output_start; | 190 | output_data = (unsigned char *)output_start; |
| 189 | free_mem_ptr = free_mem_ptr_p; | 191 | free_mem_ptr = free_mem_ptr_p; |
| 190 | free_mem_end_ptr = free_mem_ptr_end_p; | 192 | 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, | |||
| 193 | arch_decomp_setup(); | 195 | arch_decomp_setup(); |
| 194 | 196 | ||
| 195 | putstr("Uncompressing Linux..."); | 197 | putstr("Uncompressing Linux..."); |
| 196 | do_decompress(input_data, input_data_end - input_data, | 198 | ret = do_decompress(input_data, input_data_end - input_data, |
| 197 | output_data, error); | 199 | output_data, error); |
| 198 | putstr(" done, booting the kernel.\n"); | 200 | if (ret) |
| 201 | error("decompressor returned an error"); | ||
| 202 | else | ||
| 203 | putstr(" done, booting the kernel.\n"); | ||
| 199 | } | 204 | } |
