[PATCH] bootm: improve error message when gzip decompression buffer is too small
Aristo Chen
jj251510319013 at gmail.com
Mon Apr 28 08:07:57 CEST 2025
Currently, when decompressing a gzip-compressed image during bootm, a
generic error such as "inflate() returned -5" is shown when the buffer is
too small. However, it is not immediately clear that this is caused by
CONFIG_SYS_BOOTM_LEN being too small.
This patch improves error handling by:
- Detecting Z_BUF_ERROR (-5) returned from the inflate() call
- Suggesting the user to increase CONFIG_SYS_BOOTM_LEN when applicable
- Preserving the original return code from zunzip() instead of overwriting
it with -1
By providing clearer hints when decompression fails due to insufficient
buffer size, this change helps users diagnose and fix boot failures more
easily.
Signed-off-by: Aristo Chen <aristo.chen at canonical.com>
---
boot/bootm.c | 15 +++++++++++++++
lib/gunzip.c | 2 +-
2 files changed, 16 insertions(+), 1 deletion(-)
diff --git a/boot/bootm.c b/boot/bootm.c
index f5cbb10f0d1..eae19232487 100644
--- a/boot/bootm.c
+++ b/boot/bootm.c
@@ -34,6 +34,7 @@
#include <bootm.h>
#include <image.h>
+#include <u-boot/zlib.h>
#define MAX_CMDLINE_SIZE SZ_4K
@@ -573,12 +574,26 @@ static int handle_decomp_error(int comp_type, size_t uncomp_size,
size_t buf_size, int ret)
{
const char *name = genimg_get_comp_name(comp_type);
+ bool likely_buf_too_small = false;
/* ENOSYS means unimplemented compression type, don't reset. */
if (ret == -ENOSYS)
return BOOTM_ERR_UNIMPLEMENTED;
+ switch (comp_type) {
+ case IH_COMP_GZIP:
+ if (ret == Z_BUF_ERROR) /* -5 */
+ likely_buf_too_small = true;
+ break;
+ // Add more if necessary
+ default:
+ break;
+ }
+
if (uncomp_size >= buf_size)
+ likely_buf_too_small = true;
+
+ if (likely_buf_too_small)
printf("Image too large: increase CONFIG_SYS_BOOTM_LEN\n");
else
printf("%s: uncompress error %d\n", name, ret);
diff --git a/lib/gunzip.c b/lib/gunzip.c
index 52007715bda..a05dcde9a75 100644
--- a/lib/gunzip.c
+++ b/lib/gunzip.c
@@ -299,7 +299,7 @@ __rcode int zunzip(void *dst, int dstlen, unsigned char *src,
if (stoponerr == 1 && r != Z_STREAM_END &&
(s.avail_in == 0 || s.avail_out == 0 || r != Z_BUF_ERROR)) {
printf("Error: inflate() returned %d\n", r);
- err = -1;
+ err = r;
break;
}
} while (r == Z_BUF_ERROR);
--
2.34.1
More information about the U-Boot
mailing list