[PATCH xserver] xwayland: Activate and enable touch devices

Hans de Goede hdegoede at redhat.com
Fri Oct 21 09:10:09 UTC 2016


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 at redhat.com>

Patch LGTM:

Reviewed-by: Hans de Goede <hdegoede at 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
>


More information about the xorg-devel mailing list