Message ID | 320fc777863880247c2aff4a9d1a54ba69abf080.1643445149.git.christophe.jaillet@wanadoo.fr (mailing list archive) |
---|---|
State | Accepted |
Headers | show |
Series | iio: adc: men_z188_adc: Fix a resource leak in an error handling path | expand |
On Sat, 29 Jan 2022 09:32:47 +0100 Christophe JAILLET <christophe.jaillet@wanadoo.fr> wrote: > If iio_device_register() fails, a previous ioremap() is left unbalanced. > > Update the error handling path and add the missing iounmap() call, as > already done in the remove function. > > Fixes: 74aeac4da66f ("iio: adc: Add MEN 16z188 ADC driver") > Signed-off-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr> This is a good target for a devm_ conversion at somepoint, but this is indeed the minimal fix so we should do this first. Applied to the fixes-togreg branch of iio.git and marked for stable. Thanks, Jonathan > --- > drivers/iio/adc/men_z188_adc.c | 9 ++++++++- > 1 file changed, 8 insertions(+), 1 deletion(-) > > diff --git a/drivers/iio/adc/men_z188_adc.c b/drivers/iio/adc/men_z188_adc.c > index 42ea8bc7e780..adc5ceaef8c9 100644 > --- a/drivers/iio/adc/men_z188_adc.c > +++ b/drivers/iio/adc/men_z188_adc.c > @@ -103,6 +103,7 @@ static int men_z188_probe(struct mcb_device *dev, > struct z188_adc *adc; > struct iio_dev *indio_dev; > struct resource *mem; > + int ret; > > indio_dev = devm_iio_device_alloc(&dev->dev, sizeof(struct z188_adc)); > if (!indio_dev) > @@ -128,8 +129,14 @@ static int men_z188_probe(struct mcb_device *dev, > adc->mem = mem; > mcb_set_drvdata(dev, indio_dev); > > - return iio_device_register(indio_dev); > + ret = iio_device_register(indio_dev); > + if (ret) > + goto err_unmap; > + > + return 0; > > +err_unmap: > + iounmap(adc->base); > err: > mcb_release_mem(mem); > return -ENXIO;
diff --git a/drivers/iio/adc/men_z188_adc.c b/drivers/iio/adc/men_z188_adc.c index 42ea8bc7e780..adc5ceaef8c9 100644 --- a/drivers/iio/adc/men_z188_adc.c +++ b/drivers/iio/adc/men_z188_adc.c @@ -103,6 +103,7 @@ static int men_z188_probe(struct mcb_device *dev, struct z188_adc *adc; struct iio_dev *indio_dev; struct resource *mem; + int ret; indio_dev = devm_iio_device_alloc(&dev->dev, sizeof(struct z188_adc)); if (!indio_dev) @@ -128,8 +129,14 @@ static int men_z188_probe(struct mcb_device *dev, adc->mem = mem; mcb_set_drvdata(dev, indio_dev); - return iio_device_register(indio_dev); + ret = iio_device_register(indio_dev); + if (ret) + goto err_unmap; + + return 0; +err_unmap: + iounmap(adc->base); err: mcb_release_mem(mem); return -ENXIO;
If iio_device_register() fails, a previous ioremap() is left unbalanced. Update the error handling path and add the missing iounmap() call, as already done in the remove function. Fixes: 74aeac4da66f ("iio: adc: Add MEN 16z188 ADC driver") Signed-off-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr> --- drivers/iio/adc/men_z188_adc.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-)