[xserver] xwayland: Activate and enable touch devices

Submitted by Olivier Fourdan on Oct. 21, 2016, 8:11 a.m.

Details

Message ID 20161021081145.29825-1-ofourdan@redhat.com
State Accepted
Commit 007f8ee61a35ceda36b43e772a9a1074b8e27a06
Headers show
Series "xwayland: Activate and enable touch devices" ( rev: 1 ) in X.org (DEPRECATED - USE GITLAB)

Not browsing as part of any series.

Commit Message

Olivier Fourdan Oct. 21, 2016, 8:11 a.m.
On some random condition, a touch event may trigger a crash in Xwayland
in GetTouchEvents().

The (simplified) backtrace goes as follow:

 (gdb) bt
 #0  GetTouchEvents() at getevents.c:1892
 #1  QueueTouchEvents() at getevents.c:1866
 #2  xwl_touch_send_event() at xwayland-input.c:652
 #5  wl_closure_invoke() from libwayland-client.so.0
 #6  dispatch_event() from libwayland-client.so.0
 #7  wl_display_dispatch_queue_pending() from libwayland-client.so.0
 #8  xwl_read_events() at xwayland.c:483
 #9  ospoll_wait() at ospoll.c:412
 #10 WaitForSomething() at WaitFor.c:222
 #11 Dispatch() at dispatch.c:412
 #12 dix_main() at main.c:287
 #13 __libc_start_main() at libc-start.c:289
 #14 _start ()

The crash occurs when trying to access the sprite associated with the
touch device, which appears to be NULL. Reason being the device itself
is more a keyboard device than a touch device.

Moreover, it appears the device is neither enabled nor activated
(inited=0, enabled=0) which doesn't seem right, but matches the code in
init_touch() from xwayland-input.c which would enable the device if it
was previously existing and otherwise would create the device but not
activate it.

Make sure we do activate and enable touch devices just like we do for
other input devices such as keyboard and pointer.

Signed-off-by: Olivier Fourdan <ofourdan@redhat.com>
---
 hw/xwayland/xwayland-input.c | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

Patch hide | download patch | download mbox

diff --git a/hw/xwayland/xwayland-input.c b/hw/xwayland/xwayland-input.c
index 4d447a5..9a7123a 100644
--- a/hw/xwayland/xwayland-input.c
+++ b/hw/xwayland/xwayland-input.c
@@ -1056,12 +1056,13 @@  init_touch(struct xwl_seat *xwl_seat)
     wl_touch_add_listener(xwl_seat->wl_touch,
                           &touch_listener, xwl_seat);
 
-    if (xwl_seat->touch)
-        EnableDevice(xwl_seat->touch, TRUE);
-    else {
+    if (xwl_seat->touch == NULL) {
         xwl_seat->touch =
             add_device(xwl_seat, "xwayland-touch", xwl_touch_proc);
+        ActivateDevice(xwl_seat->touch, TRUE);
     }
+    EnableDevice(xwl_seat->touch, TRUE);
+
 }
 
 static void

Comments

HI,

On 21-10-16 10:11, Olivier Fourdan wrote:
> On some random condition, a touch event may trigger a crash in Xwayland
> in GetTouchEvents().
>
> The (simplified) backtrace goes as follow:
>
>  (gdb) bt
>  #0  GetTouchEvents() at getevents.c:1892
>  #1  QueueTouchEvents() at getevents.c:1866
>  #2  xwl_touch_send_event() at xwayland-input.c:652
>  #5  wl_closure_invoke() from libwayland-client.so.0
>  #6  dispatch_event() from libwayland-client.so.0
>  #7  wl_display_dispatch_queue_pending() from libwayland-client.so.0
>  #8  xwl_read_events() at xwayland.c:483
>  #9  ospoll_wait() at ospoll.c:412
>  #10 WaitForSomething() at WaitFor.c:222
>  #11 Dispatch() at dispatch.c:412
>  #12 dix_main() at main.c:287
>  #13 __libc_start_main() at libc-start.c:289
>  #14 _start ()
>
> The crash occurs when trying to access the sprite associated with the
> touch device, which appears to be NULL. Reason being the device itself
> is more a keyboard device than a touch device.
>
> Moreover, it appears the device is neither enabled nor activated
> (inited=0, enabled=0) which doesn't seem right, but matches the code in
> init_touch() from xwayland-input.c which would enable the device if it
> was previously existing and otherwise would create the device but not
> activate it.
>
> Make sure we do activate and enable touch devices just like we do for
> other input devices such as keyboard and pointer.
>
> Signed-off-by: Olivier Fourdan <ofourdan@redhat.com>

Patch LGTM:

Reviewed-by: Hans de Goede <hdegoede@redhat.com>

Regards,

Hans




> ---
>  hw/xwayland/xwayland-input.c | 7 ++++---
>  1 file changed, 4 insertions(+), 3 deletions(-)
>
> diff --git a/hw/xwayland/xwayland-input.c b/hw/xwayland/xwayland-input.c
> index 4d447a5..9a7123a 100644
> --- a/hw/xwayland/xwayland-input.c
> +++ b/hw/xwayland/xwayland-input.c
> @@ -1056,12 +1056,13 @@ init_touch(struct xwl_seat *xwl_seat)
>      wl_touch_add_listener(xwl_seat->wl_touch,
>                            &touch_listener, xwl_seat);
>
> -    if (xwl_seat->touch)
> -        EnableDevice(xwl_seat->touch, TRUE);
> -    else {
> +    if (xwl_seat->touch == NULL) {
>          xwl_seat->touch =
>              add_device(xwl_seat, "xwayland-touch", xwl_touch_proc);
> +        ActivateDevice(xwl_seat->touch, TRUE);
>      }
> +    EnableDevice(xwl_seat->touch, TRUE);
> +
>  }
>
>  static void
>