[PATCH v5 1/9] block: partitions: of: Skip child nodes without reg property
Loic Poulain <[email protected]> Fri, 12 Jun 2026 15:20:53 +0200
| Newsgroups | org.infradead.lists.ath10k,org.kernel.vger.linux-arm-msm,org.kernel.vger.linux-block,org.kernel.vger.linux-bluetooth,org.kernel.vger.linux-devicetree,org.kernel.vger.linux-kernel,org.kernel.vger.linux-mmc,org.kernel.vger.linux-wireless,org.kernel.vger.netdev |
|---|---|
| Message-ID | <[email protected]> |
Child nodes of a fixed-partitions node are not necessarily partition entries, for example an nvmem-layout node has no reg property. The current code passes a NULL reg pointer and uninitialized len to the length check, which can result in a kernel panic or silent failure to register any partitions. Fix validate_of_partition() to return a skip indicator when no reg property is present. Guard add_of_partition() with a reg property check for the same reason. Signed-off-by: Loic Poulain <[email protected]> --- block/partitions/of.c | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/block/partitions/of.c b/block/partitions/of.c index c22b6066109819c71568f73e8db8833d196b1cf6..534e02a9d85f62611d880af9b302d9fd49aa4d46 100644 --- a/block/partitions/of.c +++ b/block/partitions/of.c @@ -15,6 +15,10 @@ static int validate_of_partition(struct device_node *np, int slot) int a_cells = of_n_addr_cells(np); int s_cells = of_n_size_cells(np); + /* Skip nodes without a reg property (e.g. nvmem-layout) */ + if (!reg) + return 1; + /* Make sure reg len match the expected addr and size cells */ if (len / sizeof(*reg) != a_cells + s_cells) return -EINVAL; @@ -80,14 +84,15 @@ int of_partition(struct parsed_partitions *state) slot = 1; /* Validate parition offset and size */ for_each_child_of_node(partitions_np, np) { - if (validate_of_partition(np, slot)) { + int err = validate_of_partition(np, slot); + + if (err < 0) { of_node_put(np); of_node_put(partitions_np); - return -1; } - - slot++; + if (!err) + slot++; } slot = 1; @@ -97,9 +102,10 @@ int of_partition(struct parsed_partitions *state) break; } - add_of_partition(state, slot, np); - - slot++; + if (of_property_present(np, "reg")) { + add_of_partition(state, slot, np); + slot++; + } } seq_buf_puts(&state->pp_buf, "\n"); -- 2.34.1