Input: ff-core - make use of __free() cleanup facility
authorDmitry Torokhov <dmitry.torokhov@gmail.com>
Thu, 7 Nov 2024 07:15:29 +0000 (23:15 -0800)
committerDmitry Torokhov <dmitry.torokhov@gmail.com>
Tue, 24 Dec 2024 06:53:21 +0000 (22:53 -0800)
Annotate allocated memory with __free(kfree) to simplify the code and
make sure memory is released appropriately.

Tested-by: Marek Szyprowski <m.szyprowski@samsung.com>
Link: https://lore.kernel.org/r/20241107071538.195340-3-dmitry.torokhov@gmail.com
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
drivers/input/ff-core.c

index eb01bcb69d001042a8c8b8713b1bed2b1c98bb75..b527308cb52ec867222d0ca13c18f5f5394cb665 100644 (file)
@@ -290,8 +290,6 @@ EXPORT_SYMBOL_GPL(input_ff_event);
  */
 int input_ff_create(struct input_dev *dev, unsigned int max_effects)
 {
-       struct ff_device *ff;
-       size_t ff_dev_size;
        int i;
 
        if (!max_effects) {
@@ -304,25 +302,19 @@ int input_ff_create(struct input_dev *dev, unsigned int max_effects)
                return -EINVAL;
        }
 
-       ff_dev_size = struct_size(ff, effect_owners, max_effects);
-       if (ff_dev_size == SIZE_MAX) /* overflow */
-               return -EINVAL;
-
-       ff = kzalloc(ff_dev_size, GFP_KERNEL);
+       struct ff_device *ff __free(kfree) =
+               kzalloc(struct_size(ff, effect_owners, max_effects),
+                       GFP_KERNEL);
        if (!ff)
                return -ENOMEM;
 
-       ff->effects = kcalloc(max_effects, sizeof(struct ff_effect),
-                             GFP_KERNEL);
-       if (!ff->effects) {
-               kfree(ff);
+       ff->effects = kcalloc(max_effects, sizeof(*ff->effects), GFP_KERNEL);
+       if (!ff->effects)
                return -ENOMEM;
-       }
 
        ff->max_effects = max_effects;
        mutex_init(&ff->mutex);
 
-       dev->ff = ff;
        dev->flush = input_ff_flush;
        dev->event = input_ff_event;
        __set_bit(EV_FF, dev->evbit);
@@ -335,6 +327,8 @@ int input_ff_create(struct input_dev *dev, unsigned int max_effects)
        if (test_bit(FF_PERIODIC, ff->ffbit))
                __set_bit(FF_RUMBLE, dev->ffbit);
 
+       dev->ff = no_free_ptr(ff);
+
        return 0;
 }
 EXPORT_SYMBOL_GPL(input_ff_create);