summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBoyan Ding <stu_dby@126.com>2014-09-03 17:25:30 +0800
committerPekka Paalanen <pekka.paalanen@collabora.co.uk>2014-09-03 16:07:34 +0300
commit3c6d20c5eb51d20dce337961a3a5e5342315da49 (patch)
treeccc379aa829ad61f89ded65e5d64457b12a814fd
parentde7e2b3ce3d8a929b47b6248c42364b2510c65ab (diff)
downloadweston-3c6d20c5eb51d20dce337961a3a5e5342315da49.tar.gz
xwm: Check whether the seat is NULL when needed in weston_wm_handle_button
XCB and wayland input event handling exists together in xwm, which can cause problems. weston_wm_handle_button is called via XCB events, while it calls weston_wm_pick_seat_for_window, which uses info from compositor (pure wayland). It is also true in setting and removing flags of frames. Races can happen in between, when resize of moving flag of the frame is still set while the button has been released, the picked seat will be NULL in weston_wm_handle_button, causing crash. We can safely ignore moving or resizing if this happens. The same applies to c06a180d. Fixes: https://bugs.freedesktop.org/show_bug.cgi?id=82827 Signed-off-by: Boyan Ding <stu_dby@126.com> Acked-by: Pekka Paalanen <pekka.paalanen@collabora.co.uk>
-rw-r--r--xwayland/window-manager.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/xwayland/window-manager.c b/xwayland/window-manager.c
index a216b764..f633324d 100644
--- a/xwayland/window-manager.c
+++ b/xwayland/window-manager.c
@@ -1648,12 +1648,14 @@ weston_wm_handle_button(struct weston_wm *wm, xcb_generic_event_t *event)
weston_wm_window_schedule_repaint(window);
if (frame_status(window->frame) & FRAME_STATUS_MOVE) {
- shell_interface->move(window->shsurf, seat);
+ if (seat != NULL)
+ shell_interface->move(window->shsurf, seat);
frame_status_clear(window->frame, FRAME_STATUS_MOVE);
}
if (frame_status(window->frame) & FRAME_STATUS_RESIZE) {
- shell_interface->resize(window->shsurf, seat, location);
+ if (seat != NULL)
+ shell_interface->resize(window->shsurf, seat, location);
frame_status_clear(window->frame, FRAME_STATUS_RESIZE);
}