From 5bb5bedd347dee5d3928d71e568405b2d449f02d Mon Sep 17 00:00:00 2001 From: Herve Codina Date: Tue, 10 Feb 2026 18:33:31 +0100 Subject: [PATCH 1/2] fdtdump: Return an error code on wrong tag value fdtdump prints a message on stderr when it encounters a wrong tag and stop its processing without returning an error code. Having a wrong tag is really a failure. Indeed, the processing cannot continue. Be more strict. Stop the processing, print a message and return an error code. In other words, call die(). Signed-off-by: Herve Codina Message-ID: <20260210173349.636766-4-herve.codina@bootlin.com> Signed-off-by: David Gibson --- fdtdump.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/fdtdump.c b/fdtdump.c index 6c9ad90..0e7a265 100644 --- a/fdtdump.c +++ b/fdtdump.c @@ -146,8 +146,7 @@ static void dump_blob(void *blob, bool debug) continue; } - fprintf(stderr, "%*s ** Unknown tag 0x%08"PRIx32"\n", depth * shift, "", tag); - break; + die("** Unknown tag 0x%08"PRIx32"\n", tag); } } From 5976c4a6609829861093af7c56ffd90fb8925cae Mon Sep 17 00:00:00 2001 From: Herve Codina Date: Tue, 10 Feb 2026 18:33:32 +0100 Subject: [PATCH 2/2] libfdt: fdt_rw: Introduce fdt_downgrade_version() Current code perform a version downgrade at one place only, the end of fdt_rw_probe_(). In order to offer a finer grain and choose to downgrade or not depending on the exact writes done, introduce fdt_downgrade_version() to perform the downgrade operation. The modification doesn't introduce any functional changes. Signed-off-by: Herve Codina Message-ID: <20260210173349.636766-5-herve.codina@bootlin.com> Signed-off-by: David Gibson --- libfdt/fdt_rw.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/libfdt/fdt_rw.c b/libfdt/fdt_rw.c index 7475caf..90ea14e 100644 --- a/libfdt/fdt_rw.c +++ b/libfdt/fdt_rw.c @@ -22,6 +22,12 @@ static int fdt_blocks_misordered_(const void *fdt, (fdt_off_dt_strings(fdt) + fdt_size_dt_strings(fdt))); } +static void fdt_downgrade_version(void *fdt) +{ + if (!can_assume(LATEST) && fdt_version(fdt) > FDT_LAST_SUPPORTED_VERSION) + fdt_set_version(fdt, FDT_LAST_SUPPORTED_VERSION); +} + static int fdt_rw_probe_(void *fdt) { if (can_assume(VALID_DTB)) @@ -33,9 +39,8 @@ static int fdt_rw_probe_(void *fdt) if (fdt_blocks_misordered_(fdt, sizeof(struct fdt_reserve_entry), fdt_size_dt_struct(fdt))) return -FDT_ERR_BADLAYOUT; - if (!can_assume(LATEST) && fdt_version(fdt) > 17) - fdt_set_version(fdt, 17); + fdt_downgrade_version(fdt); return 0; }