aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/boot
diff options
context:
space:
mode:
authorNicolas Pitre <nicolas.pitre@linaro.org>2011-04-21 21:59:49 -0400
committerNicolas Pitre <nico@fluxnic.net>2011-05-07 00:08:01 -0400
commitccc1c7c6c25661f0071a7ebe997abcbf529df3e9 (patch)
treea879518e3e9d70521d0ac1103ec3bbbd2a2b7aba /arch/arm/boot
parente40f1e9fb342a2e38fae164861a8cff248ceb87b (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>
Diffstat (limited to 'arch/arm/boot')
-rw-r--r--arch/arm/boot/compressed/decompress.c4
-rw-r--r--arch/arm/boot/compressed/misc.c13
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
47void do_decompress(u8 *input, int len, u8 *output, void (*error)(char *x)) 47int 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
180extern void do_decompress(u8 *input, int len, u8 *output, void (*error)(char *x)); 180extern int do_decompress(u8 *input, int len, u8 *output, void (*error)(char *x));
181 181
182 182
183void 183void
@@ -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}