Skip to content

Commit ecfe9a0

Browse files
Sergey Shtylyovlinusw
authored andcommitted
pinctrl: core: handle radix_tree_insert() errors in pinctrl_register_one_pin()
pinctrl_register_one_pin() doesn't check the result of radix_tree_insert() despite they both may return a negative error code. Linus Walleij said he has copied the radix tree code from kernel/irq/ where the functions calling radix_tree_insert() are *void* themselves; I think it makes more sense to propagate the errors from radix_tree_insert() upstream if we can do that... Found by Linux Verification Center (linuxtesting.org) with the Svace static analysis tool. Signed-off-by: Sergey Shtylyov <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Linus Walleij <[email protected]>
1 parent b56e23b commit ecfe9a0

File tree

1 file changed

+11
-3
lines changed

1 file changed

+11
-3
lines changed

drivers/pinctrl/core.c

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,7 @@ static int pinctrl_register_one_pin(struct pinctrl_dev *pctldev,
205205
const struct pinctrl_pin_desc *pin)
206206
{
207207
struct pin_desc *pindesc;
208+
int error;
208209

209210
pindesc = pin_desc_get(pctldev, pin->number);
210211
if (pindesc) {
@@ -226,18 +227,25 @@ static int pinctrl_register_one_pin(struct pinctrl_dev *pctldev,
226227
} else {
227228
pindesc->name = kasprintf(GFP_KERNEL, "PIN%u", pin->number);
228229
if (!pindesc->name) {
229-
kfree(pindesc);
230-
return -ENOMEM;
230+
error = -ENOMEM;
231+
goto failed;
231232
}
232233
pindesc->dynamic_name = true;
233234
}
234235

235236
pindesc->drv_data = pin->drv_data;
236237

237-
radix_tree_insert(&pctldev->pin_desc_tree, pin->number, pindesc);
238+
error = radix_tree_insert(&pctldev->pin_desc_tree, pin->number, pindesc);
239+
if (error)
240+
goto failed;
241+
238242
pr_debug("registered pin %d (%s) on %s\n",
239243
pin->number, pindesc->name, pctldev->desc->name);
240244
return 0;
245+
246+
failed:
247+
kfree(pindesc);
248+
return error;
241249
}
242250

243251
static int pinctrl_register_pins(struct pinctrl_dev *pctldev,

0 commit comments

Comments
 (0)