Patch "of: overlay: Call of_changeset_init() early" has been added to the 5.15-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    of: overlay: Call of_changeset_init() early

to the 5.15-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     of-overlay-call-of_changeset_init-early.patch
and it can be found in the queue-5.15 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 80cd242fad2142fb9ef227ac021db769e8438db7
Author: Geert Uytterhoeven <geert+renesas@xxxxxxxxx>
Date:   Fri Jul 28 10:50:28 2023 +0200

    of: overlay: Call of_changeset_init() early
    
    [ Upstream commit a9515ff4fb142b690a0d2b58782b15903b990dba ]
    
    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: f948d6d8b792bb90 ("of: overlay: avoid race condition between applying multiple overlays")
    Signed-off-by: Geert Uytterhoeven <geert+renesas@xxxxxxxxx>
    Link: https://lore.kernel.org/r/4f1d6d74b61cba2599026adb6d1948ae559ce91f.1690533838.git.geert+renesas@xxxxxxxxx
    Signed-off-by: Rob Herring <robh@xxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/of/overlay.c b/drivers/of/overlay.c
index 8f2ddba3947e5..ee7f3659b353c 100644
--- a/drivers/of/overlay.c
+++ b/drivers/of/overlay.c
@@ -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()



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux