All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] bootm: improve error message when gzip decompression buffer is too small
@ 2025-04-28  6:07 Aristo Chen
  2025-04-28 17:24 ` Tom Rini
  2025-04-30  2:23 ` [PATCH v2 1/1] " Aristo Chen
  0 siblings, 2 replies; 10+ messages in thread
From: Aristo Chen @ 2025-04-28  6:07 UTC (permalink / raw)
  To: u-boot
  Cc: aristo.chen, trini, sjg, ilias.apalodimas, sughosh.ganu,
	mkorpershoek, Zone.Niuzh

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@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


^ permalink raw reply related	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2025-05-05 23:35 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-04-28  6:07 [PATCH] bootm: improve error message when gzip decompression buffer is too small Aristo Chen
2025-04-28 17:24 ` Tom Rini
2025-04-29 10:08   ` 陳偉銘
2025-04-29 14:15     ` Tom Rini
2025-04-29 15:15       ` Aristo Chen
2025-04-29 19:17         ` Tom Rini
2025-04-30  2:23 ` [PATCH v2 1/1] " Aristo Chen
2025-04-30 14:36   ` Tom Rini
2025-04-30 14:56   ` Mattijs Korpershoek
2025-05-05 23:35   ` Tom Rini

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.