[PATCH libinput] libinput: Fix the close_restricted interface callback

Jasper St. Pierre jstpierre at mecheye.net
Sat Mar 1 11:19:03 PST 2014

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.
 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 8185bf2..65c5ea0 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;
+	close(touchpad->fsm.timer.fd);
 	libinput_remove_source(libinput, touchpad->fsm.timer.source);
diff --git a/src/libinput.c b/src/libinput.c
index 58b87b0..182c401 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);

More information about the wayland-devel mailing list