[PATCH xwayland] xwayland: Unconditionally initialize lists in init_tablet_manager_seat()

Lyude lyude at redhat.com
Thu May 4 22:04:31 UTC 2017

In the event that xwayland gets launched on a wayland compositor that
doesn't yet have support for wp_tablet_manager, we end up skipping the
initialization of the lists. This is wrong, because regardless of
whether or not a tablet is present we still attempt to traverse these
lists later in xwl_set_cursor(), expecting that if the lists are empty
from no tablet manager that we simply won't execute any loop iterations.

(EE) Backtrace:
(EE) 0: Xwayland (OsSigHandler+0x3b) [0x4982f9]
(EE) 1: /lib64/libpthread.so.0 (__restore_rt+0x0) [0x7f73722545bf]
(EE) 2: Xwayland (xwl_set_cursor+0x9f) [0x429974]
(EE) 3: Xwayland (miPointerUpdateSprite+0x261) [0x4fe1ca]
(EE) 4: Xwayland (mieqProcessInputEvents+0x239) [0x4f8d33]
(EE) 5: Xwayland (ProcessInputEvents+0x9) [0x4282f0]
(EE) 6: Xwayland (Dispatch+0x42) [0x43e2d4]
(EE) 7: Xwayland (dix_main+0x5c9) [0x44c6dc]
(EE) 8: Xwayland (main+0x28) [0x61c523]
(EE) 9: /lib64/libc.so.6 (__libc_start_main+0xf1) [0x7f7371e9d401]
(EE) 10: Xwayland (_start+0x2a) [0x4208fa]
(EE) 11: ? (?+0x2a) [0x2a]
(EE) Segmentation fault at address 0x28
Fatal server error:
(EE) Caught signal 11 (Segmentation fault). Server aborting

Reproduced when trying to run upstream xwayland under fedora 25's weston

Signed-off-by: Lyude <lyude at redhat.com>
Cc: Carlos Garnacho <carlosg at gnome.org>
Cc: Peter Hutterer <peter.hutterer at who-t.net>
 hw/xwayland/xwayland-input.c | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/hw/xwayland/xwayland-input.c b/hw/xwayland/xwayland-input.c
index bb667c4..557aac8 100644
--- a/hw/xwayland/xwayland-input.c
+++ b/hw/xwayland/xwayland-input.c
@@ -2194,6 +2194,10 @@ static void
 init_tablet_manager_seat(struct xwl_screen *xwl_screen,
                          struct xwl_seat *xwl_seat)
+    xorg_list_init(&xwl_seat->tablets);
+    xorg_list_init(&xwl_seat->tablet_tools);
+    xorg_list_init(&xwl_seat->tablet_pads);
     if (!xwl_screen->tablet_manager)
@@ -2201,10 +2205,6 @@ init_tablet_manager_seat(struct xwl_screen *xwl_screen,
-    xorg_list_init(&xwl_seat->tablets);
-    xorg_list_init(&xwl_seat->tablet_tools);
-    xorg_list_init(&xwl_seat->tablet_pads);
     zwp_tablet_seat_v2_add_listener(xwl_seat->tablet_seat, &tablet_seat_listener, xwl_seat);

More information about the xorg-devel mailing list