usb: ulpi: Add missing of_node_get() in ulpi_of_register()
Subsystems (4)
PATCH 1/1 usb: ulpi: Add missing of_node_get() in ulpi_of_register()
In ulpi_of_register() we call of_find_node_by_name() which unconditionally calls of_node_put() on the 'from' argument. We haven't called of_node_get() though, so we've put the node once without getting it first. Add the of_node_get() call so that things are properly balanced.
--- drivers/usb/common/ulpi.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/usb/common/ulpi.c +2 -2
@@ -182,9 +182,9 @@ static int ulpi_of_register(struct ulpi *ulpi)/* Find a ulpi bus underneath the parent or the grandparent */ parent = ulpi->dev.parent; -if (parent->of_node) +if (of_node_get (parent->of_node)) np =of_find_node_by_name (parent->of_node,"ulpi" ); -else if (parent->parent && parent->parent->of_node) +else if (parent->parent &&of_node_get (parent->parent->of_node)) np =of_find_node_by_name (parent->parent->of_node,"ulpi" );if (!np)return 0 ;
Signature · 2 lines
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum, a Linux Foundation Collaborative Project
Quoted 18 lines · Stephen Boyd
In
ulpi_of_register()we callof_find_node_by_name()which unconditionally callsof_node_put()on the 'from' argument. We haven't calledof_node_get()though, so we've put the node once without getting it first. Add theof_node_get()call so that things are properly balanced.Fixes ef6a7bcfb01c ("usb: ulpi: Support device discovery via DT")Reported-by Peter Robinson <[email protected]>Signed-off-by Stephen Boyd <[email protected]>--- drivers/usb/common/ulpi.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)drivers/usb/common/ulpi.c +0
-0
drivers/usb/common/ulpi.c static int ulpi_of_register(struct ulpi *ulpi) · line 188
Quoted 9 lines
drivers/usb/common/ulpi.c +2
-2@@ -182,9 +182,9 @@ static int ulpi_of_register(struct ulpi *ulpi)/* Find a ulpi bus underneath the parent or the grandparent */ parent = ulpi->dev.parent; -if (parent->of_node) +if (of_node_get (parent->of_node)) np =of_find_node_by_name (parent->of_node,"ulpi" ); -else if (parent->parent && parent->parent->of_node) +else if (parent->parent &&of_node_get (parent->parent->of_node)) np =of_find_node_by_name (parent->parent->of_node,"ulpi" );
I'm afraid this isn't the right fix; the code shouldn't have been using of_find_node_by_name() in the first place as that function searches the whole device tree depth-first starting at the parent (or grand parent), which could end up matching an unrelated node.
of_get_child_by_name() is the helper to use for such lookups instead.
Turns out we have a few other driver with similar bugs. I've started fixing a few of them that'll be sending out per subsystem.
I'll post a fix for this one as follow up to this mail meanwhile.
Thanks,
Johan
PATCH 1/1 USB: ulpi: fix bus-node lookup
In reply to Stephen BoydFix bus-node lookup during registration, which ended up searching the whole device tree depth-first starting at the parent (or grand parent) rather than just matching on its children.
To make things worse, the parent (or grand-parent) node could end being prematurely freed as well.
--- drivers/usb/common/ulpi.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/usb/common/ulpi.c +2 -2
@@ -180,9 +180,9 @@ static int ulpi_of_register(struct ulpi *ulpi)/* Find a ulpi bus underneath the parent or the grandparent */ parent = ulpi->dev.parent;if (parent->of_node) - np =of_find_node_by_name (parent->of_node,"ulpi" ); + np =of_get_child_by_name (parent->of_node,"ulpi" );else if (parent->parent && parent->parent->of_node) - np =of_find_node_by_name (parent->parent->of_node,"ulpi" ); + np =of_get_child_by_name (parent->parent->of_node,"ulpi" );if (!np)return 0 ;
Signature · 1 line
2.15.0