Commit ab5b769a authored by Jing Xiangfeng's avatar Jing Xiangfeng Committed by Greg Kroah-Hartman
Browse files

staging: gasket: interrupt: fix the missed eventfd_ctx_put() in gasket_interrupt.c



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: 9a69f508 ("drivers/staging: Gasket driver framework + Apex driver")
Signed-off-by: default avatarJing Xiangfeng <jingxiangfeng@huawei.com>
Link: https://lore.kernel.org/r/20201112064924.99680-1-jingxiangfeng@huawei.com


Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 8b5b1b81
Loading
Loading
Loading
Loading
+10 −5
Original line number Diff line number Diff line
@@ -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;

	if (interrupt_data->eventfd_ctxs[interrupt]) {
		eventfd_ctx_put(interrupt_data->eventfd_ctxs[interrupt]);
		interrupt_data->eventfd_ctxs[interrupt] = NULL;
	}
	return 0;
}