keybinding: Check for handler functions as well

With the addition of the locate-pointer special keybinding (defaults to
the [Control] key), we have now two separate special modifier keys which
can be triggered separately, one for the locate-pointer action and
another one for overlay.

When processing those special modifier keys, mutter must ensure that the
key was pressed alone, being a modifier, the key could otherwise be part
of another key combo.

As result, if both special modifiers keys are pressed simultaneously,
mutter will try to trigger the function for the second key being
pressed, and since those special modifier keys have no default handler
function set, that will crash mutter.

Check if the handler has a function associated and treat the keybinding
as not found if no handler function is set, as with the special modifier
keys.

https://gitlab.gnome.org/GNOME/mutter/issues/823
This commit is contained in:
Olivier Fourdan 2019-09-24 16:58:32 +02:00
parent 0706e021f5
commit 76f2579e44

View File

@ -1933,6 +1933,12 @@ invoke_handler (MetaDisplay *display,
NULL);
}
static gboolean
meta_key_binding_has_handler_func (MetaKeyBinding *binding)
{
return (!!binding->handler->func || !!binding->handler->default_func);
}
static gboolean
process_event (MetaDisplay *display,
MetaWindow *window,
@ -1958,6 +1964,9 @@ process_event (MetaDisplay *display,
if (binding->handler == NULL)
meta_bug ("Binding %s has no handler\n", binding->name);
if (!meta_key_binding_has_handler_func (binding))
goto not_found;
if (display->focus_window &&
!(binding->handler->flags & META_KEY_BINDING_NON_MASKABLE))
{