[Wayland-bugs] [Bug 103298] infinite loop when lid events are repeated - list item points to itself

bugzilla-daemon at freedesktop.org bugzilla-daemon at freedesktop.org
Fri Oct 27 19:15:45 UTC 2017


https://bugs.freedesktop.org/show_bug.cgi?id=103298

Alban Browaeys <prahal at yahoo.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
 Attachment #135132|the version of the patch I  |the version of the patch I
        description|applied for session2 -      |applied for session1 -
                   |changed to apply against    |changed to apply against
                   |1.8                         |1.8

--- Comment #13 from Alban Browaeys <prahal at yahoo.com> ---
Comment on attachment 135132
  --> https://bugs.freedesktop.org/attachment.cgi?id=135132
the version of the patch I applied for session1 - changed to apply against 1.8

>Once the lid is closed, the keyboard event listener is set up to open the lid
>for us on keyboard events. With the right sequence, we can trigger the
>listener to be added to the list multiple times, triggering an assert in the
>list test code (or an infinite loop in the 1.8 branch).
>
>Conditions:
>* SW_LID value 1 - sets up the keyboard listener
>* keyboard event - sets lid_is_closed to false
>* SW_LID value 0 - is ignored because we're already open
>* SW_LID value 1 - sets up the keyboard listener again
>
>https://bugs.freedesktop.org/show_bug.cgi?id=103298
>
>Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
>---
> src/evdev-fallback.c | 13 ++++++-------
> test/test-switch.c   | 40 +++++++++++++++++++++-------------------
> 2 files changed, 27 insertions(+), 26 deletions(-)
>
>--- a/test/test-lid.c
>+++ b/test/test-lid.c
>@@ -426,26 +426,27 @@
> 
> 	keyboard = litest_add_device(li, LITEST_KEYBOARD);
> 
>-	litest_lid_action(sw, LIBINPUT_SWITCH_STATE_ON);
>-	litest_drain_events(li);
>-
>-	litest_event(keyboard, EV_KEY, KEY_A, 1);
>-	litest_event(keyboard, EV_SYN, SYN_REPORT, 0);
>-	litest_event(keyboard, EV_KEY, KEY_A, 0);
>-	litest_event(keyboard, EV_SYN, SYN_REPORT, 0);
>-	libinput_dispatch(li);
>-
>-	event = libinput_get_event(li);
>-	litest_is_switch_event(event,
>-			       LIBINPUT_SWITCH_LID,
>-			       LIBINPUT_SWITCH_STATE_OFF);
>-
>-	litest_assert_only_typed_events(li, LIBINPUT_EVENT_KEYBOARD_KEY);
>-
>-	litest_lid_action(sw, LIBINPUT_SWITCH_STATE_OFF);
>-	litest_assert_empty_queue(li);
>-
>-	libinput_event_destroy(event);
>+	for (int i = 0; i < 3; i++) {
>+		litest_lid_action(sw, LIBINPUT_SWITCH_STATE_ON);
>+		litest_drain_events(li);
>+
>+		litest_event(keyboard, EV_KEY, KEY_A, 1);
>+		litest_event(keyboard, EV_SYN, SYN_REPORT, 0);
>+		litest_event(keyboard, EV_KEY, KEY_A, 0);
>+		litest_event(keyboard, EV_SYN, SYN_REPORT, 0);
>+		libinput_dispatch(li);
>+
>+		event = libinput_get_event(li);
>+		litest_is_switch_event(event,
>+				       LIBINPUT_SWITCH_LID,
>+				       LIBINPUT_SWITCH_STATE_OFF);
>+		libinput_event_destroy(event);
>+
>+		litest_assert_only_typed_events(li, LIBINPUT_EVENT_KEYBOARD_KEY);
>+
>+		litest_lid_action(sw, LIBINPUT_SWITCH_STATE_OFF);
>+		litest_assert_empty_queue(li);
>+	}
> 	litest_delete_device(keyboard);
> }
> END_TEST
>--- a/src/evdev-lid.c
>+++ b/src/evdev-lid.c
>@@ -104,17 +104,16 @@
> 	if (!dispatch->keyboard.keyboard)
> 		return;
> 
>+	libinput_device_remove_event_listener(&dispatch->keyboard.listener);
>+
> 	if (is_closed) {
> 		libinput_device_add_event_listener(
> 					&dispatch->keyboard.keyboard->base,
> 					&dispatch->keyboard.listener,
> 					lid_switch_keyboard_event,
> 					dispatch);
>-	} else {
>-		libinput_device_remove_event_listener(
>-					&dispatch->keyboard.listener);
>-		libinput_device_init_event_listener(
>-					&dispatch->keyboard.listener);
>+
>+		libinput_device_init_event_listener(&dispatch->keyboard.listener);
> 	}
> }
> 
>@@ -130,11 +129,12 @@
> 	case SW_LID:
> 		is_closed = !!e->value;
> 
>-		if (dispatch->lid_is_closed == is_closed)
>-			return;
> 		lid_switch_toggle_keyboard_listener(dispatch,
> 						    is_closed);
> 
>+		if (dispatch->lid_is_closed == is_closed)
>+			return;
>+
> 		dispatch->lid_is_closed = is_closed;
> 
> 		lid_switch_notify_toggle(dispatch, device, time);

-- 
You are receiving this mail because:
You are the assignee for the bug.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/wayland-bugs/attachments/20171027/125d2ae2/attachment-0001.html>


More information about the wayland-bugs mailing list