From dbcd1484759f8c50fdc61bdc8fc48cf8294a1ae8 Mon Sep 17 00:00:00 2001 From: Joseph Chen Date: Fri, 29 Sep 2017 09:14:20 +0800 Subject: [PATCH] drivers: irq: malloc a temporary string for strtok strtok will update original input string. Change-Id: I9c81a72045f057c8a7d17f688e2d9f70dd849880 Signed-off-by: Joseph Chen --- drivers/irq/irq-gpio-switch.c | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/drivers/irq/irq-gpio-switch.c b/drivers/irq/irq-gpio-switch.c index 79c78034cf..18cab91f2a 100644 --- a/drivers/irq/irq-gpio-switch.c +++ b/drivers/irq/irq-gpio-switch.c @@ -89,19 +89,25 @@ static int _irq_to_gpio(int irq) int gpio_to_irq(struct gpio_desc *gpio) { - int irq_gpio, bank; + int irq_gpio, bank, ret = EINVAL_GPIO; bool found; - char *name; + char *name, *name_tok; if (!gpio->dev->name) { printf("can't find device name for the gpio bank\n"); return EINVAL_GPIO; } - name = strtok((char *)gpio->dev->name, "@"); + name_tok = strdup(gpio->dev->name); + if (!name_tok) { + printf("Error: strdup in %s failed!\n", __func__); + return -ENOMEM; + } + + name = strtok(name_tok, "@"); if (!name) { printf("can't find correct device name for the gpio bank\n"); - return EINVAL_GPIO; + goto out; } for (bank = 0; bank < ARRAY_SIZE(gpio_banks); bank++) { @@ -113,14 +119,19 @@ int gpio_to_irq(struct gpio_desc *gpio) if (!found) { printf("irq gpio framework can't find %s\n", name); - return EINVAL_GPIO; + goto out; } irq_gpio = RK_IRQ_GPIO(bank, gpio->offset); if (!gpio_is_valid(irq_gpio)) - return EINVAL_GPIO; + goto out; + free(name_tok); return _hard_gpio_to_irq(irq_gpio); + +out: + free(name_tok); + return ret; } int hard_gpio_to_irq(u32 gpio)