diff options
author | Adam Jackson <ajax@redhat.com> | 2018-04-12 17:24:08 -0400 |
---|---|---|
committer | Adam Jackson <ajax@redhat.com> | 2018-04-13 10:49:56 -0400 |
commit | bf147f67b2b7170fcc5cca07192f6b195dce85e5 (patch) | |
tree | e505ccd54185ab2be5f814960424023e1b97c1a7 | |
parent | d7269b49c3408f93a6cb8e28ddc3dda88224620a (diff) |
xwayland: Don't crash on WarpPointer(dest_w = None)
Turns out that's legal, and xts exercises it, and we crash:
Thread 1 "Xwayland" received signal SIGSEGV, Segmentation fault.
dixGetPrivate (key=0x813660 <xwl_window_private_key>, privates=0x20) at ../../include/privates.h:122
122 return (char *) (*privates) + key->offset;
(gdb) bt
#0 dixGetPrivate (key=0x813660 <xwl_window_private_key>, privates=0x20) at ../../include/privates.h:122
#1 dixLookupPrivate (key=0x813660 <xwl_window_private_key>, privates=0x20) at ../../include/privates.h:166
#2 xwl_window_of_top (window=0x0) at xwayland.c:128
#3 xwl_cursor_warped_to (device=<optimized out>, screen=0x268b6e0, client=<optimized out>, window=0x0, sprite=0x300bb30,
x=2400, y=1350) at xwayland.c:292
#4 0x00000000005622ec in ProcWarpPointer (client=0x32755d0) at events.c:3618
In this case, x/y are the screen-space coordinates where the pointer
ends up, and we need to look up the (X) window there.
Signed-off-by: Adam Jackson <ajax@redhat.com>
Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net>
-rw-r--r-- | hw/xwayland/xwayland.c | 3 |
1 files changed, 3 insertions, 0 deletions
diff --git a/hw/xwayland/xwayland.c b/hw/xwayland/xwayland.c index e65d8b7e7..dd074c341 100644 --- a/hw/xwayland/xwayland.c +++ b/hw/xwayland/xwayland.c @@ -289,6 +289,9 @@ xwl_cursor_warped_to(DeviceIntPtr device, if (!xwl_seat) xwl_seat = xwl_screen_get_default_seat(xwl_screen); + if (!window) + window = XYToWindow(sprite, x, y); + xwl_window = xwl_window_of_top(window); if (!xwl_window && xwl_seat->focus_window) { focus = xwl_seat->focus_window->window; |