diff options
author | Peter Hutterer <peter.hutterer@who-t.net> | 2012-10-10 13:33:48 +1000 |
---|---|---|
committer | Peter Hutterer <peter.hutterer@who-t.net> | 2012-11-07 09:58:18 +1000 |
commit | 36f9c2d1ddc8a35c0317db55044d05f07284ab38 (patch) | |
tree | 1bfd6a79b27da8db10d29fee0757aa03c6961b45 | |
parent | 8f39a6b0b35764c8d5cac4c7bf66d5902c0ae9a5 (diff) |
dix: fix crash on shutdown if a disabled device is still grabbed (XI1 grab)
A disabled device doesn't have a sprite (less so a sprite->win) and triggers
a NULL-pointer dereference on shutdown when all active grabs are released as
part of the cleanup.
Fix this by checking for sprite being non-null and setting the focus window
to the NullWindow if it is. The rest of the patch just attempts to make
things more readable.
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Reviewed-by: Keith Packard <keithp@keithp.com>
(cherry picked from commit 4b7f00346daed20c96f3e8ea13ae411858a5424b)
-rw-r--r-- | dix/events.c | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/dix/events.c b/dix/events.c index c0e330b85..ddb5b343d 100644 --- a/dix/events.c +++ b/dix/events.c @@ -1593,13 +1593,10 @@ DeactivateKeyboardGrab(DeviceIntPtr keybd) { GrabPtr grab = keybd->deviceGrab.grab; DeviceIntPtr dev; - WindowPtr focusWin = keybd->focus ? keybd->focus->win - : keybd->spriteInfo->sprite->win; + WindowPtr focusWin; Bool wasImplicit = (keybd->deviceGrab.fromPassiveGrab && keybd->deviceGrab.implicitGrab); - if (focusWin == FollowKeyboardWin) - focusWin = inputInfo.keyboard->focus->win; if (keybd->valuator) keybd->valuator->motionHintWindow = NullWindow; keybd->deviceGrab.grab = NullGrab; @@ -1610,6 +1607,17 @@ DeactivateKeyboardGrab(DeviceIntPtr keybd) if (dev->deviceGrab.sync.other == grab) dev->deviceGrab.sync.other = NullGrab; } + + if (keybd->focus) + focusWin = keybd->focus->win; + else if (keybd->spriteInfo->sprite) + focusWin = keybd->spriteInfo->sprite->win; + else + focusWin = NullWindow; + + if (focusWin == FollowKeyboardWin) + focusWin = inputInfo.keyboard->focus->win; + DoFocusEvents(keybd, grab->window, focusWin, NotifyUngrab); if (!wasImplicit && grab->grabtype == XI2) |