[PATCH] dix: fix crash on XI 1.x grabs on disabled devices. (#54934)
Chase Douglas
chase.douglas at ubuntu.com
Sat Sep 29 11:22:06 PDT 2012
On Thu, Sep 27, 2012 at 6:56 PM, Peter Hutterer
<peter.hutterer at who-t.net> wrote:
> If the device is disabled, the sprite window is NULL and dereferencing
> crashes the server.
>
> This is only triggered for XI 1.x grabs (ProcXGrabDevice) as XI2 grabs would
> trigger another code path, creating a sprite for the disabled device as if
> detaching it (which is wrong and fixed with this patch too).
>
> Grabbing a disabled device doesn't make sense as it won't send events
> anyway. However, the protocol specs do not prohibit it, so we need to keep
> it working.
> Luckily, oldWin is only used for focus out events, which aren't necessary
> given that the device is disabled.
>
> X.Org Bug 54934 <http://bugs.freedesktop.org/show_bug.cgi?id=54934>
>
> Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
> ---
> dix/events.c | 9 ++++++---
> 1 file changed, 6 insertions(+), 3 deletions(-)
>
> diff --git a/dix/events.c b/dix/events.c
> index d1931af..96778f7 100644
> --- a/dix/events.c
> +++ b/dix/events.c
> @@ -1555,11 +1555,13 @@ ActivateKeyboardGrab(DeviceIntPtr keybd, GrabPtr grab, TimeStamp time,
> WindowPtr oldWin;
>
> /* slave devices need to float for the duration of the grab. */
> - if (grab->grabtype == XI2 &&
> + if (grab->grabtype == XI2 && keybd->enabled &&
> !(passive & ImplicitGrabMask) && !IsMaster(keybd))
> DetachFromMaster(keybd);
>
> - if (grabinfo->grab)
> + if (!keybd->enabled)
> + oldWin = NULL;
> + else if (grabinfo->grab)
> oldWin = grabinfo->grab->window;
> else if (keybd->focus)
> oldWin = keybd->focus->win;
> @@ -1571,7 +1573,8 @@ ActivateKeyboardGrab(DeviceIntPtr keybd, GrabPtr grab, TimeStamp time,
> oldWin = keybd->focus->win;
> if (keybd->valuator)
> keybd->valuator->motionHintWindow = NullWindow;
> - DoFocusEvents(keybd, oldWin, grab->window, NotifyGrab);
> + if (oldWin)
> + DoFocusEvents(keybd, oldWin, grab->window, NotifyGrab);
> if (syncEvents.playingEvents)
> grabinfo->grabTime = syncEvents.time;
> else
Looks reasonably correct to me.
Reviewed-by: Chase Douglas <chase.douglas at ubuntu.com>
More information about the xorg-devel
mailing list