diff mbox series

iio: fix memory leak in iio_device_register_eventset()

Message ID 20221115023712.3726854-1-zengheng4@huawei.com (mailing list archive)
State Accepted
Headers show
Series iio: fix memory leak in iio_device_register_eventset() | expand

Commit Message

Zeng Heng Nov. 15, 2022, 2:37 a.m. UTC
When iio_device_register_sysfs_group() returns failed,
iio_device_register_eventset() needs to free attrs array.

Otherwise, kmemleak would scan & report memory leak as below:

unreferenced object 0xffff88810a1cc3c0 (size 32):
  comm "100-i2c-vcnl302", pid 728, jiffies 4295052307 (age 156.027s)
  backtrace:
    __kmalloc+0x46/0x1b0
    iio_device_register_eventset at drivers/iio/industrialio-event.c:541
    __iio_device_register at drivers/iio/industrialio-core.c:1959
    __devm_iio_device_register at drivers/iio/industrialio-core.c:2040

Fixes: 32f171724e5c ("iio: core: rework iio device group creation")
Signed-off-by: Zeng Heng <zengheng4@huawei.com>
---
 drivers/iio/industrialio-event.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

Comments

Jonathan Cameron Nov. 16, 2022, 7:16 p.m. UTC | #1
On Tue, 15 Nov 2022 10:37:12 +0800
Zeng Heng <zengheng4@huawei.com> wrote:

> When iio_device_register_sysfs_group() returns failed,
> iio_device_register_eventset() needs to free attrs array.
> 
> Otherwise, kmemleak would scan & report memory leak as below:
> 
> unreferenced object 0xffff88810a1cc3c0 (size 32):
>   comm "100-i2c-vcnl302", pid 728, jiffies 4295052307 (age 156.027s)
>   backtrace:
>     __kmalloc+0x46/0x1b0
>     iio_device_register_eventset at drivers/iio/industrialio-event.c:541
>     __iio_device_register at drivers/iio/industrialio-core.c:1959
>     __devm_iio_device_register at drivers/iio/industrialio-core.c:2040
> 
> Fixes: 32f171724e5c ("iio: core: rework iio device group creation")
> Signed-off-by: Zeng Heng <zengheng4@huawei.com>

Good find.

Applied to the fixes-togreg branch of iio.git.

Thanks,

Jonathan

> ---
>  drivers/iio/industrialio-event.c | 4 +++-
>  1 file changed, 3 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/iio/industrialio-event.c b/drivers/iio/industrialio-event.c
> index 3d78da2531a9..727e2ef66aa4 100644
> --- a/drivers/iio/industrialio-event.c
> +++ b/drivers/iio/industrialio-event.c
> @@ -556,7 +556,7 @@ int iio_device_register_eventset(struct iio_dev *indio_dev)
>  
>  	ret = iio_device_register_sysfs_group(indio_dev, &ev_int->group);
>  	if (ret)
> -		goto error_free_setup_event_lines;
> +		goto error_free_group_attrs;
>  
>  	ev_int->ioctl_handler.ioctl = iio_event_ioctl;
>  	iio_device_ioctl_handler_register(&iio_dev_opaque->indio_dev,
> @@ -564,6 +564,8 @@ int iio_device_register_eventset(struct iio_dev *indio_dev)
>  
>  	return 0;
>  
> +error_free_group_attrs:
> +	kfree(ev_int->group.attrs);
>  error_free_setup_event_lines:
>  	iio_free_chan_devattr_list(&ev_int->dev_attr_list);
>  	kfree(ev_int);
diff mbox series

Patch

diff --git a/drivers/iio/industrialio-event.c b/drivers/iio/industrialio-event.c
index 3d78da2531a9..727e2ef66aa4 100644
--- a/drivers/iio/industrialio-event.c
+++ b/drivers/iio/industrialio-event.c
@@ -556,7 +556,7 @@  int iio_device_register_eventset(struct iio_dev *indio_dev)
 
 	ret = iio_device_register_sysfs_group(indio_dev, &ev_int->group);
 	if (ret)
-		goto error_free_setup_event_lines;
+		goto error_free_group_attrs;
 
 	ev_int->ioctl_handler.ioctl = iio_event_ioctl;
 	iio_device_ioctl_handler_register(&iio_dev_opaque->indio_dev,
@@ -564,6 +564,8 @@  int iio_device_register_eventset(struct iio_dev *indio_dev)
 
 	return 0;
 
+error_free_group_attrs:
+	kfree(ev_int->group.attrs);
 error_free_setup_event_lines:
 	iio_free_chan_devattr_list(&ev_int->dev_attr_list);
 	kfree(ev_int);