| From foo@baz Sun May 27 17:33:38 CEST 2018 |
| From: Christophe Jaillet <christophe.jaillet@wanadoo.fr> |
| Date: Tue, 13 Mar 2018 21:33:11 +0100 |
| Subject: regulator: gpio: Fix some error handling paths in 'gpio_regulator_probe()' |
| |
| From: Christophe Jaillet <christophe.jaillet@wanadoo.fr> |
| |
| [ Upstream commit ed8cffda27dea6fd3dafb3ee881c5a786edac9ca ] |
| |
| Re-order error handling code and gotos to avoid leaks in error handling |
| paths. |
| |
| Fixes: 9f946099fe19 ("regulator: gpio: fix parsing of gpio list") |
| Signed-off-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr> |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| Signed-off-by: Sasha Levin <alexander.levin@microsoft.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/regulator/gpio-regulator.c | 16 +++++++--------- |
| 1 file changed, 7 insertions(+), 9 deletions(-) |
| |
| --- a/drivers/regulator/gpio-regulator.c |
| +++ b/drivers/regulator/gpio-regulator.c |
| @@ -268,8 +268,7 @@ static int gpio_regulator_probe(struct p |
| drvdata->desc.name = kstrdup(config->supply_name, GFP_KERNEL); |
| if (drvdata->desc.name == NULL) { |
| dev_err(&pdev->dev, "Failed to allocate supply name\n"); |
| - ret = -ENOMEM; |
| - goto err; |
| + return -ENOMEM; |
| } |
| |
| if (config->nr_gpios != 0) { |
| @@ -289,7 +288,7 @@ static int gpio_regulator_probe(struct p |
| dev_err(&pdev->dev, |
| "Could not obtain regulator setting GPIOs: %d\n", |
| ret); |
| - goto err_memstate; |
| + goto err_memgpio; |
| } |
| } |
| |
| @@ -300,7 +299,7 @@ static int gpio_regulator_probe(struct p |
| if (drvdata->states == NULL) { |
| dev_err(&pdev->dev, "Failed to allocate state data\n"); |
| ret = -ENOMEM; |
| - goto err_memgpio; |
| + goto err_stategpio; |
| } |
| drvdata->nr_states = config->nr_states; |
| |
| @@ -321,7 +320,7 @@ static int gpio_regulator_probe(struct p |
| default: |
| dev_err(&pdev->dev, "No regulator type set\n"); |
| ret = -EINVAL; |
| - goto err_memgpio; |
| + goto err_memstate; |
| } |
| |
| /* build initial state from gpio init data. */ |
| @@ -358,22 +357,21 @@ static int gpio_regulator_probe(struct p |
| if (IS_ERR(drvdata->dev)) { |
| ret = PTR_ERR(drvdata->dev); |
| dev_err(&pdev->dev, "Failed to register regulator: %d\n", ret); |
| - goto err_stategpio; |
| + goto err_memstate; |
| } |
| |
| platform_set_drvdata(pdev, drvdata); |
| |
| return 0; |
| |
| -err_stategpio: |
| - gpio_free_array(drvdata->gpios, drvdata->nr_gpios); |
| err_memstate: |
| kfree(drvdata->states); |
| +err_stategpio: |
| + gpio_free_array(drvdata->gpios, drvdata->nr_gpios); |
| err_memgpio: |
| kfree(drvdata->gpios); |
| err_name: |
| kfree(drvdata->desc.name); |
| -err: |
| return ret; |
| } |
| |