iio: dummy: iio_simple_dummy: check the return value of kstrdup()
authorXiaoke Wang <xkernel.wang@foxmail.com>
Sat, 5 Mar 2022 03:14:05 +0000 (11:14 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 14 Jun 2022 16:36:19 +0000 (18:36 +0200)
[ Upstream commit ba93642188a6fed754bf7447f638bc410e05a929 ]

kstrdup() is also a memory allocation-related function, it returns NULL
when some memory errors happen. So it is better to check the return
value of it so to catch the memory error in time. Besides, there should
have a kfree() to clear up the allocation if we get a failure later in
this function to prevent memory leak.

Signed-off-by: Xiaoke Wang <xkernel.wang@foxmail.com>
Link: https://lore.kernel.org/r/tencent_C920CFCC33B9CC1C63141FE1334A39FF8508@qq.com
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/iio/dummy/iio_simple_dummy.c

index c0b7ef90073548e569b413112f7f73eddb5b33de..c24f609c2ade6df37b48bb0bc6517eb2ea4d410a 100644 (file)
@@ -575,10 +575,9 @@ static struct iio_sw_device *iio_dummy_probe(const char *name)
         */
 
        swd = kzalloc(sizeof(*swd), GFP_KERNEL);
-       if (!swd) {
-               ret = -ENOMEM;
-               goto error_kzalloc;
-       }
+       if (!swd)
+               return ERR_PTR(-ENOMEM);
+
        /*
         * Allocate an IIO device.
         *
@@ -590,7 +589,7 @@ static struct iio_sw_device *iio_dummy_probe(const char *name)
        indio_dev = iio_device_alloc(parent, sizeof(*st));
        if (!indio_dev) {
                ret = -ENOMEM;
-               goto error_ret;
+               goto error_free_swd;
        }
 
        st = iio_priv(indio_dev);
@@ -616,6 +615,10 @@ static struct iio_sw_device *iio_dummy_probe(const char *name)
         *    indio_dev->name = spi_get_device_id(spi)->name;
         */
        indio_dev->name = kstrdup(name, GFP_KERNEL);
+       if (!indio_dev->name) {
+               ret = -ENOMEM;
+               goto error_free_device;
+       }
 
        /* Provide description of available channels */
        indio_dev->channels = iio_dummy_channels;
@@ -632,7 +635,7 @@ static struct iio_sw_device *iio_dummy_probe(const char *name)
 
        ret = iio_simple_dummy_events_register(indio_dev);
        if (ret < 0)
-               goto error_free_device;
+               goto error_free_name;
 
        ret = iio_simple_dummy_configure_buffer(indio_dev);
        if (ret < 0)
@@ -649,11 +652,12 @@ error_unconfigure_buffer:
        iio_simple_dummy_unconfigure_buffer(indio_dev);
 error_unregister_events:
        iio_simple_dummy_events_unregister(indio_dev);
+error_free_name:
+       kfree(indio_dev->name);
 error_free_device:
        iio_device_free(indio_dev);
-error_ret:
+error_free_swd:
        kfree(swd);
-error_kzalloc:
        return ERR_PTR(ret);
 }