[PATCH v3 5/5] of: reserved_mem: reject static mapped regions overlapping existing reservations
From: Wandun Chen
Date: Sun Sep 20 2026 - 05:31:55 EST
From: Wandun Chen <chenwandun@xxxxxxxxxxx>
memblock_reserve() permits overlapping reservations, so a statically
placed region whose 'reg' overlaps an existing one is accepted. When
initialization of a statically placed reserved-memory region
overlapping an existing reservation fails, memblock_phys_free()
returns the overlap to the buddy allocator, corrupting that memory.
Reject the overlap up front. Dynamically allocated regions are
unaffected, as they are allocated from free memory and so cannot
overlap an existing reservation.
Sashiko found this issue in [1].
Fixes: d0b8ed47e83a ("of: reserved_mem: fix reserve memory leak")
Suggested-by: Marek Szyprowski <m.szyprowski@xxxxxxxxxxx>
Signed-off-by: Wandun Chen <chenwandun@xxxxxxxxxxx>
Link: https://sashiko.dev/#/message/20260806100605.2C2C01F000E9%40smtp.kernel.org [1]
---
drivers/of/of_reserved_mem.c | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/drivers/of/of_reserved_mem.c b/drivers/of/of_reserved_mem.c
index 8d2057f2ac12..2d1e01c0f886 100644
--- a/drivers/of/of_reserved_mem.c
+++ b/drivers/of/of_reserved_mem.c
@@ -141,6 +141,10 @@ static int __init early_init_dt_reserve_memory(phys_addr_t base,
return ret;
}
+ if (memblock_is_region_reserved(base, size) ||
+ memblock_overlaps_nomap_region(base, size))
+ return -EBUSY;
+
ret = memblock_reserve(base, size);
if (!ret)
memblock_mark_rsrv_rmem(base, size);
@@ -343,7 +347,7 @@ void __init fdt_scan_reserved_mem_late(void)
continue;
nomap = of_get_flat_dt_prop(child, "no-map", NULL) != NULL;
- if (nomap && rmem_overlaps_check(base, size, static_reserved_start))
+ if (rmem_overlaps_check(base, size, static_reserved_start))
continue;
if (!memblock_is_region_rsrv_rmem(base, size, nomap))
continue;
--
2.43.0