From 385bfdb762be88abc7089044b4b030026511c1e5 Mon Sep 17 00:00:00 2001 From: "Jasper St. Pierre" Date: Sat, 1 Mar 2014 14:19:03 -0500 Subject: [PATCH] libinput: Fix the close_restricted interface callback libinput is supposed to take a close callback in its interface to allow you to call out to a privileged API to close FDs. But the FD that libinput passes you is bogus, because libinput_remove_source closes the FD on which it's passed. This is really bad, as the libinput_source really doesn't own the FD which it's passed, so it shouldn't be trying to close() it. Only one out of the four users of libinput_remove_source actually wants their FD closed, so move the close() call there. Reviewed-by: Peter Hutterer Signed-off-by: Peter Hutterer --- src/evdev-touchpad.c | 1 + src/libinput.c | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/src/evdev-touchpad.c b/src/evdev-touchpad.c index 8185bf27..65c5ea05 100644 --- a/src/evdev-touchpad.c +++ b/src/evdev-touchpad.c @@ -714,6 +714,7 @@ touchpad_destroy(struct evdev_dispatch *dispatch) struct libinput *libinput = touchpad->device->base.seat->libinput; touchpad->filter->interface->destroy(touchpad->filter); + close(touchpad->fsm.timer.fd); libinput_remove_source(libinput, touchpad->fsm.timer.source); free(touchpad->fsm.events); free(dispatch); diff --git a/src/libinput.c b/src/libinput.c index 58b87b0f..182c401e 100644 --- a/src/libinput.c +++ b/src/libinput.c @@ -442,7 +442,6 @@ libinput_remove_source(struct libinput *libinput, struct libinput_source *source) { epoll_ctl(libinput->epoll_fd, EPOLL_CTL_DEL, source->fd, NULL); - close(source->fd); source->fd = -1; list_insert(&libinput->source_destroy_list, &source->link); }