4.19-stable review patch.  If anyone has any objections, please let me know.

------------------

[ Upstream commit a9d9f6b83f1bb05da849b3540e6d1f70ef1c2343 ]

devm_kstrdup() may return NULL if internal allocation failed.
Thus using  label, name  is unsafe without checking. Therefor
in the unlikely case of allocation failure, sx150x_probe() simply
returns -ENOMEM.

Signed-off-by: Nicholas Mc Guire <hof...@osadl.org>
Fixes: 9e80f9064e73 ("pinctrl: Add SX150X GPIO Extender Pinctrl Driver")
Signed-off-by: Linus Walleij <linus.wall...@linaro.org>
Signed-off-by: Sasha Levin <sas...@kernel.org>
---
 drivers/pinctrl/pinctrl-sx150x.c | 11 ++++++++---
 1 file changed, 8 insertions(+), 3 deletions(-)

diff --git a/drivers/pinctrl/pinctrl-sx150x.c b/drivers/pinctrl/pinctrl-sx150x.c
index cbf58a10113d..4d87d75b9c6e 100644
--- a/drivers/pinctrl/pinctrl-sx150x.c
+++ b/drivers/pinctrl/pinctrl-sx150x.c
@@ -1166,7 +1166,6 @@ static int sx150x_probe(struct i2c_client *client,
        }
 
        /* Register GPIO controller */
-       pctl->gpio.label = devm_kstrdup(dev, client->name, GFP_KERNEL);
        pctl->gpio.base = -1;
        pctl->gpio.ngpio = pctl->data->npins;
        pctl->gpio.get_direction = sx150x_gpio_get_direction;
@@ -1180,6 +1179,10 @@ static int sx150x_probe(struct i2c_client *client,
        pctl->gpio.of_node = dev->of_node;
 #endif
        pctl->gpio.can_sleep = true;
+       pctl->gpio.label = devm_kstrdup(dev, client->name, GFP_KERNEL);
+       if (!pctl->gpio.label)
+               return -ENOMEM;
+
        /*
         * Setting multiple pins is not safe when all pins are not
         * handled by the same regmap register. The oscio pin (present
@@ -1200,13 +1203,15 @@ static int sx150x_probe(struct i2c_client *client,
 
        /* Add Interrupt support if an irq is specified */
        if (client->irq > 0) {
-               pctl->irq_chip.name = devm_kstrdup(dev, client->name,
-                                                  GFP_KERNEL);
                pctl->irq_chip.irq_mask = sx150x_irq_mask;
                pctl->irq_chip.irq_unmask = sx150x_irq_unmask;
                pctl->irq_chip.irq_set_type = sx150x_irq_set_type;
                pctl->irq_chip.irq_bus_lock = sx150x_irq_bus_lock;
                pctl->irq_chip.irq_bus_sync_unlock = sx150x_irq_bus_sync_unlock;
+               pctl->irq_chip.name = devm_kstrdup(dev, client->name,
+                                                  GFP_KERNEL);
+               if (!pctl->irq_chip.name)
+                       return -ENOMEM;
 
                pctl->irq.masked = ~0;
                pctl->irq.sense = 0;
-- 
2.19.1



Reply via email to