]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
iio: light: veml6070: Fix resource leak in probe error path
authorFelix Gu <ustc.gu@gmail.com>
Fri, 27 Mar 2026 12:27:54 +0000 (20:27 +0800)
committerJonathan Cameron <jic23@kernel.org>
Tue, 28 Apr 2026 15:36:09 +0000 (16:36 +0100)
The driver calls i2c_new_dummy_device() to create a dummy device,
then calls i2c_smbus_write_byte(). If i2c_smbus_write_byte() fails and
returns, the cleanup via devm_add_action_or_reset() was never registered,
so the dummy device leaks.

Switch to devm_i2c_new_dummy_device() which registers cleanup atomically
with device creation, eliminating the error-path window.

Fixes: 7501bff87c3e ("iio: light: veml6070: add action for i2c_unregister_device")
Reviewed-by: Andy Shevchenko <andriy.shevchenko@intel.com>
Signed-off-by: Felix Gu <ustc.gu@gmail.com>
Cc: <Stable@vger.kernel.org>
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
drivers/iio/light/veml6070.c

index 74d7246e5225e912e12c6528ab60196fae667558..4bbd86d0cb46a97cac7f9f6764c086fc3af6ce66 100644 (file)
@@ -245,13 +245,6 @@ static const struct iio_info veml6070_info = {
        .write_raw = veml6070_write_raw,
 };
 
-static void veml6070_i2c_unreg(void *p)
-{
-       struct veml6070_data *data = p;
-
-       i2c_unregister_device(data->client2);
-}
-
 static int veml6070_probe(struct i2c_client *client)
 {
        struct veml6070_data *data;
@@ -281,7 +274,8 @@ static int veml6070_probe(struct i2c_client *client)
        if (ret < 0)
                return ret;
 
-       data->client2 = i2c_new_dummy_device(client->adapter, VEML6070_ADDR_DATA_LSB);
+       data->client2 = devm_i2c_new_dummy_device(&client->dev, client->adapter,
+                                                 VEML6070_ADDR_DATA_LSB);
        if (IS_ERR(data->client2))
                return dev_err_probe(&client->dev, PTR_ERR(data->client2),
                                     "i2c device for second chip address failed\n");
@@ -292,10 +286,6 @@ static int veml6070_probe(struct i2c_client *client)
        if (ret < 0)
                return ret;
 
-       ret = devm_add_action_or_reset(&client->dev, veml6070_i2c_unreg, data);
-       if (ret < 0)
-               return ret;
-
        return devm_iio_device_register(&client->dev, indio_dev);
 }