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 --- 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