[PATCH RFC 2/5] liveupdate: validate restored LUO FDT before use

Cris Jacob Maamor
2026-05-01T09:49:35Z

kernel/liveupdate/luo_core.c | 10 +++++++++-
1 file changed, 9 insertions(+), 1 deletion(-)

diff --git a/kernel/liveupdate/luo_core.c b/kernel/liveupdate/luo_core.c
index 803f51c84275..633a16434164 100644
--- a/kernel/liveupdate/luo_core.c
+++ b/kernel/liveupdate/luo_core.c
@@ -82,6 +82,7 @@ early_param("liveupdate", early_liveupdate_param);

static int __init luo_early_startup(void)
{
+ size_t fdt_size;
phys_addr_t fdt_phys;
int err, ln_size;
const void *ptr;
@@ -94,7 +95,8 @@ static int __init luo_early_startup(void)
}

/* Retrieve LUO subtree, and verify its format. */
- err = kho_retrieve_subtree(LUO_FDT_KHO_ENTRY_NAME, &fdt_phys, NULL);
+ err = kho_retrieve_subtree(LUO_FDT_KHO_ENTRY_NAME, &fdt_phys,
+ &fdt_size);
if (err) {
if (err != -ENOENT) {
pr_err("failed to retrieve FDT '%s' from KHO: %pe\n",
@@ -105,6 +107,12 @@ static int __init luo_early_startup(void)
return 0;
}

+ if (!fdt_size || fdt_size > LUO_FDT_SIZE ||
+ !kho_is_preserved(fdt_phys, DIV_ROUND_UP(fdt_size, PAGE_SIZE))) {
+ pr_err("Invalid LUO FDT from KHO\n");
+ return -EINVAL;
+ }
+
luo_global.fdt_in = phys_to_virt(fdt_phys);
err = fdt_node_check_compatible(luo_global.fdt_in, 0,
LUO_FDT_COMPATIBLE);
--
2.53.0