]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
of: resolver: Simplify of_resolve_phandles() using __free()
authorRob Herring (Arm) <robh@kernel.org>
Sun, 9 Feb 2025 12:59:02 +0000 (20:59 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 2 May 2025 05:50:41 +0000 (07:50 +0200)
[ Upstream commit 5275e8b5293f65cc82a5ee5eab02dd573b911d6e ]

Use the __free() cleanup to simplify of_resolve_phandles() and remove
all the goto's.

Signed-off-by: Rob Herring (Arm) <robh@kernel.org>
Stable-dep-of: a46a0805635d ("of: resolver: Fix device node refcount leakage in of_resolve_phandles()")
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/of/resolver.c

index b278ab4338ceb5ea16723daa00b6b7d51cc5f7aa..2dd19dc6987c7b6c181bb65d8b06c461c89b657c 100644 (file)
@@ -263,24 +263,20 @@ static int adjust_local_phandle_references(struct device_node *local_fixups,
 int of_resolve_phandles(struct device_node *overlay)
 {
        struct device_node *child, *local_fixups, *refnode;
-       struct device_node *tree_symbols, *overlay_fixups;
+       struct device_node *overlay_fixups;
        struct property *prop;
        const char *refpath;
        phandle phandle, phandle_delta;
        int err;
 
-       tree_symbols = NULL;
-
        if (!overlay) {
                pr_err("null overlay\n");
-               err = -EINVAL;
-               goto out;
+               return -EINVAL;
        }
 
        if (!of_node_check_flag(overlay, OF_DETACHED)) {
                pr_err("overlay not detached\n");
-               err = -EINVAL;
-               goto out;
+               return -EINVAL;
        }
 
        phandle_delta = live_tree_max_phandle() + 1;
@@ -292,7 +288,7 @@ int of_resolve_phandles(struct device_node *overlay)
 
        err = adjust_local_phandle_references(local_fixups, overlay, phandle_delta);
        if (err)
-               goto out;
+               return err;
 
        overlay_fixups = NULL;
 
@@ -301,16 +297,13 @@ int of_resolve_phandles(struct device_node *overlay)
                        overlay_fixups = child;
        }
 
-       if (!overlay_fixups) {
-               err = 0;
-               goto out;
-       }
+       if (!overlay_fixups)
+               return 0;
 
-       tree_symbols = of_find_node_by_path("/__symbols__");
+       struct device_node __free(device_node) *tree_symbols = of_find_node_by_path("/__symbols__");
        if (!tree_symbols) {
                pr_err("no symbols in root of device tree.\n");
-               err = -EINVAL;
-               goto out;
+               return -EINVAL;
        }
 
        for_each_property_of_node(overlay_fixups, prop) {
@@ -324,14 +317,12 @@ int of_resolve_phandles(struct device_node *overlay)
                if (err) {
                        pr_err("node label '%s' not found in live devicetree symbols table\n",
                               prop->name);
-                       goto out;
+                       return err;
                }
 
                refnode = of_find_node_by_path(refpath);
-               if (!refnode) {
-                       err = -ENOENT;
-                       goto out;
-               }
+               if (!refnode)
+                       return -ENOENT;
 
                phandle = refnode->phandle;
                of_node_put(refnode);
@@ -341,11 +332,8 @@ int of_resolve_phandles(struct device_node *overlay)
                        break;
        }
 
-out:
        if (err)
                pr_err("overlay phandle fixup failed: %d\n", err);
-       of_node_put(tree_symbols);
-
        return err;
 }
 EXPORT_SYMBOL_GPL(of_resolve_phandles);