[PATCH v2 3/5] of: reserved_mem: reject statically placed regions overlapping existing reservations
Wandun Chen <[email protected]>
| Newsgroups | org.kvack.linux-mm,org.kernel.vger.linux-devicetree,org.kernel.vger.linux-kernel |
|---|---|
| Message-ID | <[email protected]> |
From: Wandun Chen <[email protected]> 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") Signed-off-by: Wandun Chen <[email protected]> Link: https://sashiko.dev/#/message/20260806100605.2C2C01F000E9%40smtp.kernel.org [1] --- drivers/of/of_reserved_mem.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/drivers/of/of_reserved_mem.c b/drivers/of/of_reserved_mem.c index 9fb2e4c29443..767ef702392e 100644 --- a/drivers/of/of_reserved_mem.c +++ b/drivers/of/of_reserved_mem.c @@ -158,6 +158,11 @@ static int __init early_init_dt_reserve_memory(phys_addr_t base, return memblock_mark_nomap(base, size); } + + if (memblock_is_region_reserved(base, size) || + memblock_overlaps_nomap(base, size)) + return -EBUSY; + return memblock_reserve(base, size); } -- 2.43.0