staging: gasket: interrupt: fix the missed eventfd_ctx_put() in gasket_interrupt.c
authorJing Xiangfeng <jingxiangfeng@huawei.com>
Thu, 12 Nov 2020 06:49:24 +0000 (14:49 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 13 Nov 2020 14:35:14 +0000 (15:35 +0100)
gasket_interrupt_set_eventfd() misses to call eventfd_ctx_put() in an
error path. We check interrupt is valid before calling
eventfd_ctx_fdget() to fix it.

There is the same issue in gasket_interrupt_clear_eventfd(), Add the
missed function call to fix it.

Fixes: 9a69f5087ccc ("drivers/staging: Gasket driver framework + Apex driver")
Signed-off-by: Jing Xiangfeng <jingxiangfeng@huawei.com>
Link: https://lore.kernel.org/r/20201112064924.99680-1-jingxiangfeng@huawei.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/gasket/gasket_interrupt.c

index 2d6195f7300e91c05c8116f4eae87c725045a901..864342acfd86e8917304842a79f8c094dd687a9e 100644 (file)
@@ -487,14 +487,16 @@ int gasket_interrupt_system_status(struct gasket_dev *gasket_dev)
 int gasket_interrupt_set_eventfd(struct gasket_interrupt_data *interrupt_data,
                                 int interrupt, int event_fd)
 {
-       struct eventfd_ctx *ctx = eventfd_ctx_fdget(event_fd);
-
-       if (IS_ERR(ctx))
-               return PTR_ERR(ctx);
+       struct eventfd_ctx *ctx;
 
        if (interrupt < 0 || interrupt >= interrupt_data->num_interrupts)
                return -EINVAL;
 
+       ctx = eventfd_ctx_fdget(event_fd);
+
+       if (IS_ERR(ctx))
+               return PTR_ERR(ctx);
+
        interrupt_data->eventfd_ctxs[interrupt] = ctx;
        return 0;
 }
@@ -505,6 +507,9 @@ int gasket_interrupt_clear_eventfd(struct gasket_interrupt_data *interrupt_data,
        if (interrupt < 0 || interrupt >= interrupt_data->num_interrupts)
                return -EINVAL;
 
-       interrupt_data->eventfd_ctxs[interrupt] = NULL;
+       if (interrupt_data->eventfd_ctxs[interrupt]) {
+               eventfd_ctx_put(interrupt_data->eventfd_ctxs[interrupt]);
+               interrupt_data->eventfd_ctxs[interrupt] = NULL;
+       }
        return 0;
 }