Skip to content

Commit

Permalink
of/base: Clean up exit paths for of_parse_phandle_with_args()
Browse files Browse the repository at this point in the history
Some of the exit paths were not correctly releasing the node. Fix it by
creating an 'err' label for collecting the error paths and releasing the
node.

Cc: Rob Herring <rob.herring@calxeda.com>
Signed-off-by: Grant Likely <grant.likely@secretlab.ca>
  • Loading branch information
Grant Likely committed Feb 13, 2013
1 parent cabb7d5 commit 23ce04c
Showing 1 changed file with 19 additions and 7 deletions.
26 changes: 19 additions & 7 deletions drivers/of/base.c
Original file line number Diff line number Diff line change
Expand Up @@ -1096,7 +1096,7 @@ int of_parse_phandle_with_args(const struct device_node *np, const char *list_na
struct of_phandle_args *out_args)
{
const __be32 *list, *list_end;
int size, cur_index = 0;
int rc = 0, size, cur_index = 0;
uint32_t count = 0;
struct device_node *node = NULL;
phandle phandle;
Expand All @@ -1109,6 +1109,7 @@ int of_parse_phandle_with_args(const struct device_node *np, const char *list_na

/* Loop over the phandles until all the requested entry is found */
while (list < list_end) {
rc = -EINVAL;
count = 0;

/*
Expand All @@ -1125,13 +1126,13 @@ int of_parse_phandle_with_args(const struct device_node *np, const char *list_na
if (!node) {
pr_err("%s: could not find phandle\n",
np->full_name);
break;
goto err;
}
if (of_property_read_u32(node, cells_name, &count)) {
pr_err("%s: could not get %s for %s\n",
np->full_name, cells_name,
node->full_name);
break;
goto err;
}

/*
Expand All @@ -1141,7 +1142,7 @@ int of_parse_phandle_with_args(const struct device_node *np, const char *list_na
if (list + count > list_end) {
pr_err("%s: arguments longer than property\n",
np->full_name);
break;
goto err;
}
}

Expand All @@ -1151,9 +1152,10 @@ int of_parse_phandle_with_args(const struct device_node *np, const char *list_na
* index matches, then fill the out_args structure and return,
* or return -ENOENT for an empty entry.
*/
rc = -ENOENT;
if (cur_index == index) {
if (!phandle)
return -ENOENT;
goto err;

if (out_args) {
int i;
Expand All @@ -1164,6 +1166,10 @@ int of_parse_phandle_with_args(const struct device_node *np, const char *list_na
for (i = 0; i < count; i++)
out_args->args[i] = be32_to_cpup(list++);
}

/* Found it! return success */
if (node)
of_node_put(node);
return 0;
}

Expand All @@ -1173,10 +1179,16 @@ int of_parse_phandle_with_args(const struct device_node *np, const char *list_na
cur_index++;
}

/* Loop exited without finding a valid entry; return an error */
/*
* Unlock node before returning result; will be one of:
* -ENOENT : index is for empty phandle
* -EINVAL : parsing error on data
*/
rc = -ENOENT;
err:
if (node)
of_node_put(node);
return -EINVAL;
return rc;
}
EXPORT_SYMBOL(of_parse_phandle_with_args);

Expand Down

0 comments on commit 23ce04c

Please sign in to comment.