summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Hutterer <peter.hutterer@who-t.net>2012-10-10 13:33:48 +1000
committerPeter Hutterer <peter.hutterer@who-t.net>2012-11-07 09:58:18 +1000
commit36f9c2d1ddc8a35c0317db55044d05f07284ab38 (patch)
tree1bfd6a79b27da8db10d29fee0757aa03c6961b45
parent8f39a6b0b35764c8d5cac4c7bf66d5902c0ae9a5 (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.c16
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)