of: fix of_node leak caused in of_find_node_opts_by_path
authorQi Hou <qi.hou@windriver.com>
Mon, 6 Feb 2017 04:55:19 +0000 (12:55 +0800)
committerRob Herring <robh@kernel.org>
Thu, 9 Feb 2017 15:11:30 +0000 (09:11 -0600)
During stepping down the tree, parent node is gotten first and its refcount is
increased with of_node_get() in __of_get_next_child(). Since it just being used
as tmp node, its refcount must be decreased with of_node_put() after traversing
its child nodes.

Or, its refcount will never be descreased to ZERO, then it will never be freed,
as well as other related memory blocks.

To fix this, decrease refcount of parent with of_node_put() after
__of_find_node_by_path().

Signed-off-by: Qi Hou <qi.hou@windriver.com>
Acked-by: Peter Rosin <peda@axentia.se>
Signed-off-by: Rob Herring <robh@kernel.org>
drivers/of/base.c

index d4bea3c797d6a7b6a4d28c55cfdff1d30d03cc16..ce8206f9f97aade503cf62ba85283cfc5b0de30c 100644 (file)
@@ -842,8 +842,11 @@ struct device_node *of_find_node_opts_by_path(const char *path, const char **opt
        if (!np)
                np = of_node_get(of_root);
        while (np && *path == '/') {
+               struct device_node *tmp = np;
+
                path++; /* Increment past '/' delimiter */
                np = __of_find_node_by_path(np, path);
+               of_node_put(tmp);
                path = strchrnul(path, '/');
                if (separator && separator < path)
                        break;