Fix sessions with no active input devices
authorDaniel Stone <daniel@fooishbar.org>
Mon, 4 Jun 2012 10:40:47 +0000 (11:40 +0100)
committerKristian Høgsberg <krh@bitplanet.net>
Mon, 4 Jun 2012 15:02:53 +0000 (11:02 -0400)
Fix a few unconditional dereferences of seat->keyboard and seat->pointer
in paths that could be hit outside of input event processing.

Reported-by: Pekka Paalanen <ppaalanen@gmail.com>
Signed-off-by: Daniel Stone <daniel@fooishbar.org>
src/compositor.c

index 797ab99..1383966 100644 (file)
@@ -620,6 +620,9 @@ weston_device_repick(struct wl_seat *seat)
        const struct wl_pointer_grab_interface *interface;
        struct weston_surface *surface, *focus;
 
+       if (!seat->pointer)
+               return;
+
        surface = weston_compositor_pick_surface(ws->compositor,
                                                 seat->pointer->x,
                                                 seat->pointer->y,
@@ -666,9 +669,11 @@ weston_surface_unmap(struct weston_surface *surface)
        wl_list_remove(&surface->layer_link);
 
        wl_list_for_each(seat, &surface->compositor->seat_list, link) {
-               if (seat->seat.keyboard->focus == &surface->surface)
+               if (seat->seat.keyboard &&
+                   seat->seat.keyboard->focus == &surface->surface)
                        wl_keyboard_set_focus(seat->seat.keyboard, NULL);
-               if (seat->seat.pointer->focus == &surface->surface)
+               if (seat->seat.pointer &&
+                   seat->seat.pointer->focus == &surface->surface)
                        wl_pointer_set_focus(seat->seat.pointer,
                                             NULL,
                                             wl_fixed_from_int(0),