mirror of
https://github.com/hardkernel/linux.git
synced 2026-03-26 20:40:24 +09:00
of: overlay: Call of_changeset_init() early
[ Upstream commita9515ff4fb] When of_overlay_fdt_apply() fails, the changeset may be partially applied, and the caller is still expected to call of_overlay_remove() to clean up this partial state. However, of_overlay_apply() calls of_resolve_phandles() before init_overlay_changeset(). Hence if the overlay fails to apply due to an unresolved symbol, the overlay_changeset.cset.entries list is still uninitialized, and cleanup will crash with a NULL-pointer dereference in overlay_removal_is_ok(). Fix this by moving the call to of_changeset_init() from init_overlay_changeset() to of_overlay_fdt_apply(), where all other early initialization is done. Fixes:f948d6d8b7("of: overlay: avoid race condition between applying multiple overlays") Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be> Link: https://lore.kernel.org/r/4f1d6d74b61cba2599026adb6d1948ae559ce91f.1690533838.git.geert+renesas@glider.be Signed-off-by: Rob Herring <robh@kernel.org> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
30f04a41e7
commit
01bb96ad38
@@ -752,8 +752,6 @@ static int init_overlay_changeset(struct overlay_changeset *ovcs)
|
||||
if (!of_node_is_root(ovcs->overlay_root))
|
||||
pr_debug("%s() ovcs->overlay_root is not root\n", __func__);
|
||||
|
||||
of_changeset_init(&ovcs->cset);
|
||||
|
||||
cnt = 0;
|
||||
|
||||
/* fragment nodes */
|
||||
@@ -995,6 +993,7 @@ int of_overlay_fdt_apply(const void *overlay_fdt, u32 overlay_fdt_size,
|
||||
|
||||
INIT_LIST_HEAD(&ovcs->ovcs_list);
|
||||
list_add_tail(&ovcs->ovcs_list, &ovcs_list);
|
||||
of_changeset_init(&ovcs->cset);
|
||||
|
||||
/*
|
||||
* Must create permanent copy of FDT because of_fdt_unflatten_tree()
|
||||
|
||||
Reference in New Issue
Block a user