mirror of
https://github.com/raspberrypi/linux.git
synced 2025-12-06 10:00:17 +00:00
staging: gasket: interrupt: fix the missed eventfd_ctx_put() in gasket_interrupt.c
[ Upstream commitab5b769a23] 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:9a69f5087c("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> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
63c4e010a5
commit
7f1cae8e15
@@ -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 gasket_interrupt_set_eventfd(struct gasket_interrupt_data *interrupt_data,
|
||||||
int interrupt, int event_fd)
|
int interrupt, int event_fd)
|
||||||
{
|
{
|
||||||
struct eventfd_ctx *ctx = eventfd_ctx_fdget(event_fd);
|
struct eventfd_ctx *ctx;
|
||||||
|
|
||||||
if (IS_ERR(ctx))
|
|
||||||
return PTR_ERR(ctx);
|
|
||||||
|
|
||||||
if (interrupt < 0 || interrupt >= interrupt_data->num_interrupts)
|
if (interrupt < 0 || interrupt >= interrupt_data->num_interrupts)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
|
ctx = eventfd_ctx_fdget(event_fd);
|
||||||
|
|
||||||
|
if (IS_ERR(ctx))
|
||||||
|
return PTR_ERR(ctx);
|
||||||
|
|
||||||
interrupt_data->eventfd_ctxs[interrupt] = ctx;
|
interrupt_data->eventfd_ctxs[interrupt] = ctx;
|
||||||
return 0;
|
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)
|
if (interrupt < 0 || interrupt >= interrupt_data->num_interrupts)
|
||||||
return -EINVAL;
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user