Skip to content

Commit

Permalink
of: Fix error path in of_parse_phandle_with_args_map()
Browse files Browse the repository at this point in the history
The current code uses some 'goto put;' to cancel the parsing operation
and can lead to a return code value of 0 even on error cases.

Indeed, some goto calls are done from a loop without setting the ret
value explicitly before the goto call and so the ret value can be set to
0 due to operation done in previous loop iteration. For instance match
can be set to 0 in the previous loop iteration (leading to a new
iteration) but ret can also be set to 0 it the of_property_read_u32()
call succeed. In that case if no match are found or if an error is
detected the new iteration, the return value can be wrongly 0.

Avoid those cases setting the ret value explicitly before the goto
calls.

Fixes: bd6f2fd ("of: Support parsing phandle argument lists through a nexus node")
Cc: stable@vger.kernel.org
Signed-off-by: Herve Codina <herve.codina@bootlin.com>
Link: https://lore.kernel.org/r/20241202165819.158681-1-herve.codina@bootlin.com
Signed-off-by: Rob Herring (Arm) <robh@kernel.org>
  • Loading branch information
hcodina authored and robherring committed Dec 3, 2024
1 parent 2395217 commit d7dfa7f
Showing 1 changed file with 10 additions and 5 deletions.
15 changes: 10 additions & 5 deletions drivers/of/base.c
Original file line number Diff line number Diff line change
Expand Up @@ -1471,8 +1471,10 @@ int of_parse_phandle_with_args_map(const struct device_node *np,
map_len--;

/* Check if not found */
if (!new)
if (!new) {
ret = -EINVAL;
goto put;
}

if (!of_device_is_available(new))
match = 0;
Expand All @@ -1482,17 +1484,20 @@ int of_parse_phandle_with_args_map(const struct device_node *np,
goto put;

/* Check for malformed properties */
if (WARN_ON(new_size > MAX_PHANDLE_ARGS))
goto put;
if (map_len < new_size)
if (WARN_ON(new_size > MAX_PHANDLE_ARGS) ||
map_len < new_size) {
ret = -EINVAL;
goto put;
}

/* Move forward by new node's #<list>-cells amount */
map += new_size;
map_len -= new_size;
}
if (!match)
if (!match) {
ret = -ENOENT;
goto put;
}

/* Get the <list>-map-pass-thru property (optional) */
pass = of_get_property(cur, pass_name, NULL);
Expand Down

0 comments on commit d7dfa7f

Please sign in to comment.