window: fix segfault in window_handle_key()
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>
This commit is contained in:
committed by
Kristian Høgsberg
parent
fe34083023
commit
a03a93c6ea
+2
-3
@@ -1314,11 +1314,11 @@ window_handle_key(void *data, struct wl_input_device *input_device,
|
|||||||
{
|
{
|
||||||
struct input *input = data;
|
struct input *input = data;
|
||||||
struct window *window = input->keyboard_focus;
|
struct window *window = input->keyboard_focus;
|
||||||
struct display *d = window->display;
|
struct display *d = input->display;
|
||||||
uint32_t code, sym, level;
|
uint32_t code, sym, level;
|
||||||
|
|
||||||
code = key + d->xkb->min_key_code;
|
code = key + d->xkb->min_key_code;
|
||||||
if (window->keyboard_device != input)
|
if (!window || window->keyboard_device != input)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
level = 0;
|
level = 0;
|
||||||
@@ -1394,7 +1394,6 @@ window_handle_keyboard_focus(void *data,
|
|||||||
struct display *d = input->display;
|
struct display *d = input->display;
|
||||||
uint32_t *k, *end;
|
uint32_t *k, *end;
|
||||||
|
|
||||||
window = input->keyboard_focus;
|
|
||||||
if (window) {
|
if (window) {
|
||||||
window->keyboard_device = NULL;
|
window->keyboard_device = NULL;
|
||||||
if (window->keyboard_focus_handler)
|
if (window->keyboard_focus_handler)
|
||||||
|
|||||||
Reference in New Issue
Block a user