device property: fix of node refcount leak in fwnode_graph_get_next_endpoint()
[ Upstream commit39af728649
] The 'parent' returned by fwnode_graph_get_port_parent() with refcount incremented when 'prev' is not NULL, it needs be put when finish using it. Because the parent is const, introduce a new variable to store the returned fwnode, then put it before returning from fwnode_graph_get_next_endpoint(). Fixes:b5b41ab6b0
("device property: Check fwnode->secondary in fwnode_graph_get_next_endpoint()") Signed-off-by: Yang Yingliang <yangyingliang@huawei.com> Reviewed-by: Sakari Ailus <sakari.ailus@linux.intel.com> Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com> Reviewed-and-tested-by: Daniel Scally <djrscally@gmail.com> Link: https://lore.kernel.org/r/20221123022542.2999510-1-yangyingliang@huawei.com Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
13ba563c2c
commit
e75485fc58
|
@ -989,26 +989,32 @@ struct fwnode_handle *
|
||||||
fwnode_graph_get_next_endpoint(const struct fwnode_handle *fwnode,
|
fwnode_graph_get_next_endpoint(const struct fwnode_handle *fwnode,
|
||||||
struct fwnode_handle *prev)
|
struct fwnode_handle *prev)
|
||||||
{
|
{
|
||||||
|
struct fwnode_handle *ep, *port_parent = NULL;
|
||||||
const struct fwnode_handle *parent;
|
const struct fwnode_handle *parent;
|
||||||
struct fwnode_handle *ep;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If this function is in a loop and the previous iteration returned
|
* If this function is in a loop and the previous iteration returned
|
||||||
* an endpoint from fwnode->secondary, then we need to use the secondary
|
* an endpoint from fwnode->secondary, then we need to use the secondary
|
||||||
* as parent rather than @fwnode.
|
* as parent rather than @fwnode.
|
||||||
*/
|
*/
|
||||||
if (prev)
|
if (prev) {
|
||||||
parent = fwnode_graph_get_port_parent(prev);
|
port_parent = fwnode_graph_get_port_parent(prev);
|
||||||
else
|
parent = port_parent;
|
||||||
|
} else {
|
||||||
parent = fwnode;
|
parent = fwnode;
|
||||||
|
}
|
||||||
if (IS_ERR_OR_NULL(parent))
|
if (IS_ERR_OR_NULL(parent))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
ep = fwnode_call_ptr_op(parent, graph_get_next_endpoint, prev);
|
ep = fwnode_call_ptr_op(parent, graph_get_next_endpoint, prev);
|
||||||
if (ep)
|
if (ep)
|
||||||
return ep;
|
goto out_put_port_parent;
|
||||||
|
|
||||||
return fwnode_graph_get_next_endpoint(parent->secondary, NULL);
|
ep = fwnode_graph_get_next_endpoint(parent->secondary, NULL);
|
||||||
|
|
||||||
|
out_put_port_parent:
|
||||||
|
fwnode_handle_put(port_parent);
|
||||||
|
return ep;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(fwnode_graph_get_next_endpoint);
|
EXPORT_SYMBOL_GPL(fwnode_graph_get_next_endpoint);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue