Fix a crash when shutting down a touchpad lid listener (#1440927)

This commit is contained in:
Peter Hutterer 2017-05-04 17:46:07 +10:00
parent 4e5ee47860
commit 9ceb958d7a
2 changed files with 57 additions and 8 deletions

View File

@ -1,4 +1,4 @@
From 72d597502c3bbf3462887c23afd2f184314409e8 Mon Sep 17 00:00:00 2001 From 98eca5257c1d3d62ebaaf0ed8ee262381f3dc256 Mon Sep 17 00:00:00 2001
From: Peter Hutterer <peter.hutterer@who-t.net> From: Peter Hutterer <peter.hutterer@who-t.net>
Date: Thu, 4 May 2017 14:50:31 +1000 Date: Thu, 4 May 2017 14:50:31 +1000
Subject: [PATCH libinput] lid: re-init the event listener after removing it Subject: [PATCH libinput] lid: re-init the event listener after removing it
@ -6,14 +6,16 @@ Subject: [PATCH libinput] lid: re-init the event listener after removing it
We may call remove on it again and that segfaults if it hasn't been We may call remove on it again and that segfaults if it hasn't been
initialized. initialized.
https://bugzilla.redhat.com/show_bug.cgi?id=1440927
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net> Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
(cherry picked from commit 3735359f0c66208658754e2c2b5f7e7041a2e290)
--- ---
src/evdev-lid.c | 10 ++++++++-- src/evdev-lid.c | 23 ++++++++++++++++++++---
1 file changed, 8 insertions(+), 2 deletions(-) src/evdev-mt-touchpad.c | 6 ++++++
2 files changed, 26 insertions(+), 3 deletions(-)
diff --git a/src/evdev-lid.c b/src/evdev-lid.c diff --git a/src/evdev-lid.c b/src/evdev-lid.c
index 8db7f37c..e71499bb 100644 index 8db7f37c..b7ff065e 100644
--- a/src/evdev-lid.c --- a/src/evdev-lid.c
+++ b/src/evdev-lid.c +++ b/src/evdev-lid.c
@@ -98,7 +98,9 @@ lid_switch_toggle_keyboard_listener(struct lid_switch_dispatch *dispatch, @@ -98,7 +98,9 @@ lid_switch_toggle_keyboard_listener(struct lid_switch_dispatch *dispatch,
@ -27,7 +29,25 @@ index 8db7f37c..e71499bb 100644
} }
} }
@@ -197,7 +199,9 @@ lid_switch_pair_keyboard(struct evdev_device *lid_switch, @@ -174,6 +176,17 @@ evdev_read_switch_reliability_prop(struct evdev_device *device)
}
static void
+lid_switch_remove(struct evdev_dispatch *evdev_dispatch)
+{
+ struct lid_switch_dispatch *dispatch = lid_dispatch(evdev_dispatch);
+
+ if (!dispatch->keyboard.keyboard)
+ return;
+
+ libinput_device_remove_event_listener(&dispatch->keyboard.listener);
+}
+
+static void
lid_switch_destroy(struct evdev_dispatch *evdev_dispatch)
{
struct lid_switch_dispatch *dispatch = lid_dispatch(evdev_dispatch);
@@ -197,7 +210,9 @@ lid_switch_pair_keyboard(struct evdev_device *lid_switch,
if (dispatch->keyboard.keyboard) { if (dispatch->keyboard.keyboard) {
if (bus_kbd != BUS_I8042) if (bus_kbd != BUS_I8042)
return; return;
@ -37,7 +57,7 @@ index 8db7f37c..e71499bb 100644
} }
dispatch->keyboard.keyboard = keyboard; dispatch->keyboard.keyboard = keyboard;
@@ -225,7 +229,9 @@ lid_switch_interface_device_removed(struct evdev_device *device, @@ -225,7 +240,9 @@ lid_switch_interface_device_removed(struct evdev_device *device,
if (removed_device == dispatch->keyboard.keyboard) { if (removed_device == dispatch->keyboard.keyboard) {
libinput_device_remove_event_listener( libinput_device_remove_event_listener(
@ -48,6 +68,32 @@ index 8db7f37c..e71499bb 100644
dispatch->keyboard.keyboard = NULL; dispatch->keyboard.keyboard = NULL;
} }
} }
@@ -271,7 +288,7 @@ lid_switch_sync_initial_state(struct evdev_device *device,
struct evdev_dispatch_interface lid_switch_interface = {
lid_switch_process,
NULL, /* suspend */
- NULL, /* remove */
+ lid_switch_remove,
lid_switch_destroy,
lid_switch_interface_device_added,
lid_switch_interface_device_removed,
diff --git a/src/evdev-mt-touchpad.c b/src/evdev-mt-touchpad.c
index a35688b1..73f0fdd8 100644
--- a/src/evdev-mt-touchpad.c
+++ b/src/evdev-mt-touchpad.c
@@ -1673,6 +1673,12 @@ tp_interface_device_removed(struct evdev_device *device,
tp->dwt.keyboard = NULL;
}
+ if (removed_device == tp->lid_switch.lid_switch) {
+ libinput_device_remove_event_listener(
+ &tp->lid_switch.lid_switch_listener);
+ tp->lid_switch.lid_switch = NULL;
+ }
+
if (tp->sendevents.current_mode !=
LIBINPUT_CONFIG_SEND_EVENTS_DISABLED_ON_EXTERNAL_MOUSE)
return;
-- --
2.12.2 2.12.2

View File

@ -5,7 +5,7 @@
Name: libinput Name: libinput
Version: 1.7.1 Version: 1.7.1
Release: 3%{?gitdate:.%{gitdate}git%{gitversion}}%{?dist} Release: 4%{?gitdate:.%{gitdate}git%{gitversion}}%{?dist}
Summary: Input device library Summary: Input device library
License: MIT License: MIT
@ -102,6 +102,9 @@ find $RPM_BUILD_ROOT -name '*.la' -delete
%changelog %changelog
* Thu May 04 2017 Peter Hutterer <peter.hutterer@redhat.com> 1.7.1-4
- Fix a crash when shutting down a touchpad lid listener (#1440927)
* Thu May 04 2017 Peter Hutterer <peter.hutterer@redhat.com> 1.7.1-3 * Thu May 04 2017 Peter Hutterer <peter.hutterer@redhat.com> 1.7.1-3
- Fix crash when we have multiple keyboard event listeners for the lid - Fix crash when we have multiple keyboard event listeners for the lid
switch (#1440927) switch (#1440927)