window: fix segfault in window_handle_key()
authorPekka Paalanen <ppaalanen@gmail.com>
Mon, 28 Nov 2011 14:13:57 +0000 (16:13 +0200)
committerKristian Høgsberg <krh@bitplanet.net>
Fri, 2 Dec 2011 11:31:08 +0000 (06:31 -0500)
When a window destroyed, if any input had the window in keyboard
focus, the keyboard focus is reset to NULL. A new keyboard focus is set
only, if the user clicks something. If the user presses a key instead of
clicking, the key press event is sent to the client which has NULL
keyboard focus, triggering a segfault in window_handle_key().

Fix the segfault by ignoring the key event, if there is no target
window.

I triggered this segfault by clicking the unlock dialog away, and then
pressing a key.

Signed-off-by: Pekka Paalanen <ppaalanen@gmail.com>
clients/window.c

index 1c8b9ad..5324795 100644 (file)
@@ -1314,11 +1314,11 @@ window_handle_key(void *data, struct wl_input_device *input_device,
 {
        struct input *input = data;
        struct window *window = input->keyboard_focus;
-       struct display *d = window->display;
+       struct display *d = input->display;
        uint32_t code, sym, level;
 
        code = key + d->xkb->min_key_code;
-       if (window->keyboard_device != input)
+       if (!window || window->keyboard_device != input)
                return;
 
        level = 0;
@@ -1394,7 +1394,6 @@ window_handle_keyboard_focus(void *data,
        struct display *d = input->display;
        uint32_t *k, *end;
 
-       window = input->keyboard_focus;
        if (window) {
                window->keyboard_device = NULL;
                if (window->keyboard_focus_handler)