From 6b28aadd479377f390eb0e5c596d8b576b429643 Mon Sep 17 00:00:00 2001 From: Neil Roberts Date: Mon, 23 Jan 2012 19:11:18 +0000 Subject: [PATCH] window: Fix sending button events when there's no grab The code which sends the button events was checking whether there is a focus widget with a button handler but then always sending the button event to the grab widget. If the grab widget is different from the focus widget at this point then it will check the wrong widget for a button handler and potentially crash. It is also possible for there to be no grab widget here in the following situation: 1. Press and hold down the left mouse button 2. Press and hold down the right mouse button 3. Release the left mouse button 4. Release the right mouse button In this case the grab will be released at step 3 because the code only keeps track of the grab for one button. Then it will try to send the release event for the right mouse button to a NULL widget so it will crash. --- clients/window.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/clients/window.c b/clients/window.c index fe7508d7..1356c75c 100644 --- a/clients/window.c +++ b/clients/window.c @@ -1527,12 +1527,12 @@ input_handle_button(void *data, if (input->focus_widget && input->grab == NULL && state) input_grab(input, input->focus_widget, button); - widget = input->focus_widget; + widget = input->grab; if (widget && widget->button_handler) - (*input->grab->button_handler)(widget, - input, time, - button, state, - input->grab->user_data); + (*widget->button_handler)(widget, + input, time, + button, state, + input->grab->user_data); if (input->grab && input->grab_button == button && !state) input_ungrab(input, time);