[PATCH 09/12] dix: allocate temporary grabs on the heap
Chase Douglas
chase.douglas at canonical.com
Mon Nov 7 18:10:37 PST 2011
On 11/07/2011 01:39 PM, Peter Hutterer wrote:
> Once grabs start having nested memory locations, we can't just use the
> GrabRec on the stack anymore, we need to alloc/copy/free the grabs.
>
> Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
> ---
> Xi/exevents.c | 29 +++++---
> Xi/ungrdevb.c | 30 +++++---
> Xi/ungrdevk.c | 29 +++++---
> Xi/xipassivegrab.c | 37 ++++++----
> dix/events.c | 193 ++++++++++++++++++++++++++++-----------------------
> 5 files changed, 180 insertions(+), 138 deletions(-)
>
> diff --git a/Xi/exevents.c b/Xi/exevents.c
> index 6c19ab3..0876af7 100644
> --- a/Xi/exevents.c
> +++ b/Xi/exevents.c
> @@ -2022,20 +2022,25 @@ CheckDeviceGrabAndHintWindow(WindowPtr pWin, int type,
> dev->valuator->motionHintWindow = pWin;
> else if ((type == DeviceButtonPress) && (!grab) &&
> (deliveryMask & DeviceButtonGrabMask)) {
> - GrabRec tempGrab;
> + GrabPtr tempGrab;
>
> - tempGrab.device = dev;
> - tempGrab.resource = client->clientAsMask;
> - tempGrab.window = pWin;
> - tempGrab.ownerEvents =
> + tempGrab = AllocGrab();
> + if (!tempGrab)
> + return;
> +
> + tempGrab->device = dev;
> + tempGrab->resource = client->clientAsMask;
> + tempGrab->window = pWin;
> + tempGrab->ownerEvents =
> (deliveryMask & DeviceOwnerGrabButtonMask) ? TRUE : FALSE;
> - tempGrab.eventMask = deliveryMask;
> - tempGrab.keyboardMode = GrabModeAsync;
> - tempGrab.pointerMode = GrabModeAsync;
> - tempGrab.confineTo = NullWindow;
> - tempGrab.cursor = NullCursor;
> - tempGrab.next = NULL;
> - (*dev->deviceGrab.ActivateGrab) (dev, &tempGrab, currentTime, TRUE);
> + tempGrab->eventMask = deliveryMask;
> + tempGrab->keyboardMode = GrabModeAsync;
> + tempGrab->pointerMode = GrabModeAsync;
> + tempGrab->confineTo = NullWindow;
> + tempGrab->cursor = NullCursor;
> + tempGrab->next = NULL;
> + (*dev->deviceGrab.ActivateGrab) (dev, tempGrab, currentTime, TRUE);
> + FreeGrab(tempGrab);
> }
> }
Tab vs space indenting ^^. There's a few more spots below too.
> diff --git a/Xi/ungrdevb.c b/Xi/ungrdevb.c
> index 9e9ece4..6280248 100644
> --- a/Xi/ungrdevb.c
> +++ b/Xi/ungrdevb.c
> @@ -96,7 +96,7 @@ ProcXUngrabDeviceButton(ClientPtr client)
> DeviceIntPtr dev;
> DeviceIntPtr mdev;
> WindowPtr pWin;
> - GrabRec temporaryGrab;
> + GrabPtr temporaryGrab;
> int rc;
>
> REQUEST(xUngrabDeviceButtonReq);
> @@ -126,17 +126,23 @@ ProcXUngrabDeviceButton(ClientPtr client)
> (stuff->modifiers & ~AllModifiersMask))
> return BadValue;
>
> - temporaryGrab.resource = client->clientAsMask;
> - temporaryGrab.device = dev;
> - temporaryGrab.window = pWin;
> - temporaryGrab.type = DeviceButtonPress;
> - temporaryGrab.grabtype = GRABTYPE_XI;
> - temporaryGrab.modifierDevice = mdev;
> - temporaryGrab.modifiersDetail.exact = stuff->modifiers;
> - temporaryGrab.modifiersDetail.pMask = NULL;
> - temporaryGrab.detail.exact = stuff->button;
> - temporaryGrab.detail.pMask = NULL;
> + temporaryGrab = AllocGrab();
> + if (!temporaryGrab)
> + return BadAlloc;
>
> - DeletePassiveGrabFromList(&temporaryGrab);
> + temporaryGrab->resource = client->clientAsMask;
> + temporaryGrab->device = dev;
> + temporaryGrab->window = pWin;
> + temporaryGrab->type = DeviceButtonPress;
> + temporaryGrab->grabtype = GRABTYPE_XI;
> + temporaryGrab->modifierDevice = mdev;
> + temporaryGrab->modifiersDetail.exact = stuff->modifiers;
> + temporaryGrab->modifiersDetail.pMask = NULL;
> + temporaryGrab->detail.exact = stuff->button;
> + temporaryGrab->detail.pMask = NULL;
> +
> + DeletePassiveGrabFromList(temporaryGrab);
> +
> + FreeGrab(temporaryGrab);
> return Success;
> }
> diff --git a/Xi/ungrdevk.c b/Xi/ungrdevk.c
> index 526347d..b0d83cb 100644
> --- a/Xi/ungrdevk.c
> +++ b/Xi/ungrdevk.c
> @@ -98,7 +98,7 @@ ProcXUngrabDeviceKey(ClientPtr client)
> DeviceIntPtr dev;
> DeviceIntPtr mdev;
> WindowPtr pWin;
> - GrabRec temporaryGrab;
> + GrabPtr temporaryGrab;
> int rc;
>
> REQUEST(xUngrabDeviceKeyReq);
> @@ -133,17 +133,22 @@ ProcXUngrabDeviceKey(ClientPtr client)
> (stuff->modifiers & ~AllModifiersMask))
> return BadValue;
>
> - temporaryGrab.resource = client->clientAsMask;
> - temporaryGrab.device = dev;
> - temporaryGrab.window = pWin;
> - temporaryGrab.type = DeviceKeyPress;
> - temporaryGrab.grabtype = GRABTYPE_XI;
> - temporaryGrab.modifierDevice = mdev;
> - temporaryGrab.modifiersDetail.exact = stuff->modifiers;
> - temporaryGrab.modifiersDetail.pMask = NULL;
> - temporaryGrab.detail.exact = stuff->key;
> - temporaryGrab.detail.pMask = NULL;
> + temporaryGrab = AllocGrab();
> + if (!temporaryGrab)
> + return BadAlloc;
>
> - DeletePassiveGrabFromList(&temporaryGrab);
> + temporaryGrab->resource = client->clientAsMask;
> + temporaryGrab->device = dev;
> + temporaryGrab->window = pWin;
> + temporaryGrab->type = DeviceKeyPress;
> + temporaryGrab->grabtype = GRABTYPE_XI;
> + temporaryGrab->modifierDevice = mdev;
> + temporaryGrab->modifiersDetail.exact = stuff->modifiers;
> + temporaryGrab->modifiersDetail.pMask = NULL;
> + temporaryGrab->detail.exact = stuff->key;
> + temporaryGrab->detail.pMask = NULL;
> +
> + DeletePassiveGrabFromList(temporaryGrab);
> + FreeGrab(temporaryGrab);
> return Success;
> }
> diff --git a/Xi/xipassivegrab.c b/Xi/xipassivegrab.c
> index 2f13a95..4fa887a 100644
> --- a/Xi/xipassivegrab.c
> +++ b/Xi/xipassivegrab.c
> @@ -253,7 +253,7 @@ ProcXIPassiveUngrabDevice(ClientPtr client)
> {
> DeviceIntPtr dev, mod_dev;
> WindowPtr win;
> - GrabRec tempGrab;
> + GrabPtr tempGrab;
> uint32_t* modifiers;
> int i, rc;
>
> @@ -293,29 +293,36 @@ ProcXIPassiveUngrabDevice(ClientPtr client)
>
> mod_dev = (IsFloating(dev)) ? dev : GetMaster(dev, MASTER_KEYBOARD);
>
> - tempGrab.resource = client->clientAsMask;
> - tempGrab.device = dev;
> - tempGrab.window = win;
> +
> + tempGrab = AllocGrab();
> + if (!tempGrab)
> + return BadAlloc;
> +
> + tempGrab->resource = client->clientAsMask;
> + tempGrab->device = dev;
> + tempGrab->window = win;
> switch(stuff->grab_type)
> {
> - case XIGrabtypeButton: tempGrab.type = XI_ButtonPress; break;
> - case XIGrabtypeKeycode: tempGrab.type = XI_KeyPress; break;
> - case XIGrabtypeEnter: tempGrab.type = XI_Enter; break;
> - case XIGrabtypeFocusIn: tempGrab.type = XI_FocusIn; break;
> + case XIGrabtypeButton: tempGrab->type = XI_ButtonPress; break;
> + case XIGrabtypeKeycode: tempGrab->type = XI_KeyPress; break;
> + case XIGrabtypeEnter: tempGrab->type = XI_Enter; break;
> + case XIGrabtypeFocusIn: tempGrab->type = XI_FocusIn; break;
> }
> - tempGrab.grabtype = GRABTYPE_XI2;
> - tempGrab.modifierDevice = mod_dev;
> - tempGrab.modifiersDetail.pMask = NULL;
> - tempGrab.detail.exact = stuff->detail;
> - tempGrab.detail.pMask = NULL;
> + tempGrab->grabtype = GRABTYPE_XI2;
> + tempGrab->modifierDevice = mod_dev;
> + tempGrab->modifiersDetail.pMask = NULL;
> + tempGrab->detail.exact = stuff->detail;
> + tempGrab->detail.pMask = NULL;
>
> modifiers = (uint32_t*)&stuff[1];
>
> for (i = 0; i < stuff->num_modifiers; i++, modifiers++)
> {
> - tempGrab.modifiersDetail.exact = *modifiers;
> - DeletePassiveGrabFromList(&tempGrab);
> + tempGrab->modifiersDetail.exact = *modifiers;
> + DeletePassiveGrabFromList(tempGrab);
> }
>
> + FreeGrab(tempGrab);
> +
> return Success;
> }
> diff --git a/dix/events.c b/dix/events.c
> index 51856ae..4bc6aaa 100644
> --- a/dix/events.c
> +++ b/dix/events.c
> @@ -1977,7 +1977,7 @@ static BOOL
> ActivateImplicitGrab(DeviceIntPtr dev, ClientPtr client, WindowPtr win,
> xEvent *event, Mask deliveryMask)
> {
> - GrabRec tempGrab;
> + GrabPtr tempGrab;
> OtherInputMasks *inputMasks;
> CARD8 type = event->u.u.type;
> GrabType grabtype;
> @@ -1991,30 +1991,33 @@ ActivateImplicitGrab(DeviceIntPtr dev, ClientPtr client, WindowPtr win,
> else
> return FALSE;
>
> - memset(&tempGrab, 0, sizeof(GrabRec));
> - tempGrab.next = NULL;
> - tempGrab.device = dev;
> - tempGrab.resource = client->clientAsMask;
> - tempGrab.window = win;
> - tempGrab.ownerEvents = (deliveryMask & OwnerGrabButtonMask) ? TRUE : FALSE;
> - tempGrab.eventMask = deliveryMask;
> - tempGrab.keyboardMode = GrabModeAsync;
> - tempGrab.pointerMode = GrabModeAsync;
> - tempGrab.confineTo = NullWindow;
> - tempGrab.cursor = NullCursor;
> - tempGrab.type = type;
> - tempGrab.grabtype = grabtype;
> + tempGrab = AllocGrab();
> + if (!tempGrab)
> + return FALSE;
> + tempGrab->next = NULL;
> + tempGrab->device = dev;
> + tempGrab->resource = client->clientAsMask;
> + tempGrab->window = win;
> + tempGrab->ownerEvents = (deliveryMask & OwnerGrabButtonMask) ? TRUE : FALSE;
> + tempGrab->eventMask = deliveryMask;
> + tempGrab->keyboardMode = GrabModeAsync;
> + tempGrab->pointerMode = GrabModeAsync;
> + tempGrab->confineTo = NullWindow;
> + tempGrab->cursor = NullCursor;
> + tempGrab->type = type;
> + tempGrab->grabtype = grabtype;
>
> /* get the XI and XI2 device mask */
> inputMasks = wOtherInputMasks(win);
> - tempGrab.deviceMask = (inputMasks) ? inputMasks->inputEvents[dev->id]: 0;
> + tempGrab->deviceMask = (inputMasks) ? inputMasks->inputEvents[dev->id]: 0;
>
> if (inputMasks)
> - memcpy(tempGrab.xi2mask, inputMasks->xi2mask,
> - sizeof(tempGrab.xi2mask));
> + memcpy(tempGrab->xi2mask, inputMasks->xi2mask,
> + sizeof(tempGrab->xi2mask));
>
> - (*dev->deviceGrab.ActivateGrab)(dev, &tempGrab,
> + (*dev->deviceGrab.ActivateGrab)(dev, tempGrab,
> currentTime, TRUE | ImplicitGrabMask);
> + FreeGrab(tempGrab);
> return TRUE;
> }
>
> @@ -3658,7 +3661,7 @@ CheckPassiveGrabsOnWindow(
> {
> SpritePtr pSprite = device->spriteInfo->sprite;
> GrabPtr grab = wPassiveGrabs(pWin);
> - GrabRec tempGrab;
> + GrabPtr tempGrab;
> GrabInfoPtr grabinfo;
> #define CORE_MATCH 0x1
> #define XI_MATCH 0x2
> @@ -3667,27 +3670,30 @@ CheckPassiveGrabsOnWindow(
>
> if (!grab)
> return NULL;
> +
> + tempGrab = AllocGrab();
> +
> /* Fill out the grab details, but leave the type for later before
> * comparing */
> switch (event->any.type)
> {
> case ET_KeyPress:
> case ET_KeyRelease:
> - tempGrab.detail.exact = event->device_event.detail.key;
> + tempGrab->detail.exact = event->device_event.detail.key;
> break;
> case ET_ButtonPress:
> case ET_ButtonRelease:
> - tempGrab.detail.exact = event->device_event.detail.button;
> + tempGrab->detail.exact = event->device_event.detail.button;
> break;
> default:
> - tempGrab.detail.exact = 0;
> + tempGrab->detail.exact = 0;
> break;
> }
> - tempGrab.window = pWin;
> - tempGrab.device = device;
> - tempGrab.detail.pMask = NULL;
> - tempGrab.modifiersDetail.pMask = NULL;
> - tempGrab.next = NULL;
> + tempGrab->window = pWin;
> + tempGrab->device = device;
> + tempGrab->detail.pMask = NULL;
> + tempGrab->modifiersDetail.pMask = NULL;
> + tempGrab->next = NULL;
> for (; grab; grab = grab->next)
> {
> DeviceIntPtr gdev;
> @@ -3712,29 +3718,29 @@ CheckPassiveGrabsOnWindow(
>
> if (gdev && gdev->key)
> xkbi= gdev->key->xkbInfo;
> - tempGrab.modifierDevice = grab->modifierDevice;
> - tempGrab.modifiersDetail.exact = xkbi ? xkbi->state.grab_mods : 0;
> + tempGrab->modifierDevice = grab->modifierDevice;
> + tempGrab->modifiersDetail.exact = xkbi ? xkbi->state.grab_mods : 0;
>
> /* Check for XI2 and XI grabs first */
> - tempGrab.type = GetXI2Type(event);
> - tempGrab.grabtype = GRABTYPE_XI2;
> - if (GrabMatchesSecond(&tempGrab, grab, FALSE))
> + tempGrab->type = GetXI2Type(event);
> + tempGrab->grabtype = GRABTYPE_XI2;
> + if (GrabMatchesSecond(tempGrab, grab, FALSE))
> match = XI2_MATCH;
>
> if (!match)
> {
> - tempGrab.grabtype = GRABTYPE_XI;
> - if ((tempGrab.type = GetXIType(event)) &&
> - (GrabMatchesSecond(&tempGrab, grab, FALSE)))
> + tempGrab->grabtype = GRABTYPE_XI;
> + if ((tempGrab->type = GetXIType(event)) &&
> + (GrabMatchesSecond(tempGrab, grab, FALSE)))
> match = XI_MATCH;
> }
>
> /* Check for a core grab (ignore the device when comparing) */
> if (!match && checkCore)
> {
> - tempGrab.grabtype = GRABTYPE_CORE;
> - if ((tempGrab.type = GetCoreType(event)) &&
> - (GrabMatchesSecond(&tempGrab, grab, TRUE)))
> + tempGrab->grabtype = GRABTYPE_CORE;
> + if ((tempGrab->type = GetCoreType(event)) &&
> + (GrabMatchesSecond(tempGrab, grab, TRUE)))
> match = CORE_MATCH;
> }
>
> @@ -3762,7 +3768,7 @@ CheckPassiveGrabsOnWindow(
> Since XGrabDeviceButton requires to specify the
> modifierDevice explicitly, we don't override this choice.
> */
> - if (tempGrab.type < GenericEvent)
> + if (tempGrab->type < GenericEvent)
> {
> grab->device = device;
> grab->modifierDevice = GetMaster(device, MASTER_KEYBOARD);
> @@ -3801,7 +3807,7 @@ CheckPassiveGrabsOnWindow(
> if (match & (XI_MATCH | CORE_MATCH))
> {
> event->device_event.corestate &= 0x1f00;
> - event->device_event.corestate |= tempGrab.modifiersDetail.exact &
> + event->device_event.corestate |= tempGrab->modifiersDetail.exact &
> (~0x1f00);
> }
>
> @@ -3862,6 +3868,7 @@ CheckPassiveGrabsOnWindow(
> break;
> }
>
> + FreeGrab(tempGrab);
> return grab;
> #undef CORE_MATCH
> #undef XI_MATCH
> @@ -5079,29 +5086,30 @@ GrabDevice(ClientPtr client, DeviceIntPtr dev,
> *status = GrabFrozen;
> else
> {
> - GrabRec tempGrab;
> + GrabPtr tempGrab;
>
> - /* Otherwise segfaults happen on grabbed MPX devices */
> - memset(&tempGrab, 0, sizeof(GrabRec));
> + tempGrab = AllocGrab();
>
> - tempGrab.next = NULL;
> - tempGrab.window = pWin;
> - tempGrab.resource = client->clientAsMask;
> - tempGrab.ownerEvents = ownerEvents;
> - tempGrab.keyboardMode = keyboard_mode;
> - tempGrab.pointerMode = pointer_mode;
> + tempGrab->next = NULL;
> + tempGrab->window = pWin;
> + tempGrab->resource = client->clientAsMask;
> + tempGrab->ownerEvents = ownerEvents;
> + tempGrab->keyboardMode = keyboard_mode;
> + tempGrab->pointerMode = pointer_mode;
> if (grabtype == GRABTYPE_CORE)
> - tempGrab.eventMask = mask->core;
> + tempGrab->eventMask = mask->core;
> else if (grabtype == GRABTYPE_XI)
> - tempGrab.eventMask = mask->xi;
> + tempGrab->eventMask = mask->xi;
> else
> - memcpy(tempGrab.xi2mask, mask->xi2mask, sizeof(tempGrab.xi2mask));
> - tempGrab.device = dev;
> - tempGrab.cursor = cursor;
> - tempGrab.confineTo = confineTo;
> - tempGrab.grabtype = grabtype;
> - (*grabInfo->ActivateGrab)(dev, &tempGrab, time, FALSE);
> + memcpy(tempGrab->xi2mask, mask->xi2mask, sizeof(tempGrab->xi2mask));
> + tempGrab->device = dev;
> + tempGrab->cursor = cursor;
> + tempGrab->confineTo = confineTo;
> + tempGrab->grabtype = grabtype;
> + (*grabInfo->ActivateGrab)(dev, tempGrab, time, FALSE);
> *status = GrabSuccess;
> +
> + FreeGrab(tempGrab);
> }
> return Success;
> }
> @@ -5422,7 +5430,7 @@ ProcUngrabKey(ClientPtr client)
> {
> REQUEST(xUngrabKeyReq);
> WindowPtr pWin;
> - GrabRec tempGrab;
> + GrabPtr tempGrab;
> DeviceIntPtr keybd = PickKeyboard(client);
> int rc;
>
> @@ -5444,21 +5452,27 @@ ProcUngrabKey(ClientPtr client)
> client->errorValue = stuff->modifiers;
> return BadValue;
> }
> - tempGrab.resource = client->clientAsMask;
> - tempGrab.device = keybd;
> - tempGrab.window = pWin;
> - tempGrab.modifiersDetail.exact = stuff->modifiers;
> - tempGrab.modifiersDetail.pMask = NULL;
> - tempGrab.modifierDevice = keybd;
> - tempGrab.type = KeyPress;
> - tempGrab.grabtype = GRABTYPE_CORE;
> - tempGrab.detail.exact = stuff->key;
> - tempGrab.detail.pMask = NULL;
> - tempGrab.next = NULL;
> + tempGrab = AllocGrab();
> + if (!tempGrab)
> + return BadAlloc;
> + tempGrab->resource = client->clientAsMask;
> + tempGrab->device = keybd;
> + tempGrab->window = pWin;
> + tempGrab->modifiersDetail.exact = stuff->modifiers;
> + tempGrab->modifiersDetail.pMask = NULL;
> + tempGrab->modifierDevice = keybd;
> + tempGrab->type = KeyPress;
> + tempGrab->grabtype = GRABTYPE_CORE;
> + tempGrab->detail.exact = stuff->key;
> + tempGrab->detail.pMask = NULL;
> + tempGrab->next = NULL;
>
> - if (!DeletePassiveGrabFromList(&tempGrab))
> - return BadAlloc;
> - return Success;
> + if (!DeletePassiveGrabFromList(tempGrab))
> + rc = BadAlloc;
> +
> + FreeGrab(tempGrab);
> +
> + return rc;
> }
>
> /**
> @@ -5622,7 +5636,7 @@ ProcUngrabButton(ClientPtr client)
> {
> REQUEST(xUngrabButtonReq);
> WindowPtr pWin;
> - GrabRec tempGrab;
> + GrabPtr tempGrab;
> int rc;
> DeviceIntPtr ptr;
>
> @@ -5639,21 +5653,26 @@ ProcUngrabButton(ClientPtr client)
>
> ptr = PickPointer(client);
>
> - tempGrab.resource = client->clientAsMask;
> - tempGrab.device = ptr;
> - tempGrab.window = pWin;
> - tempGrab.modifiersDetail.exact = stuff->modifiers;
> - tempGrab.modifiersDetail.pMask = NULL;
> - tempGrab.modifierDevice = GetMaster(ptr, MASTER_KEYBOARD);
> - tempGrab.type = ButtonPress;
> - tempGrab.detail.exact = stuff->button;
> - tempGrab.grabtype = GRABTYPE_CORE;
> - tempGrab.detail.pMask = NULL;
> - tempGrab.next = NULL;
> + tempGrab = AllocGrab();
> + if (!tempGrab)
> + return BadAlloc;
> + tempGrab->resource = client->clientAsMask;
> + tempGrab->device = ptr;
> + tempGrab->window = pWin;
> + tempGrab->modifiersDetail.exact = stuff->modifiers;
> + tempGrab->modifiersDetail.pMask = NULL;
> + tempGrab->modifierDevice = GetMaster(ptr, MASTER_KEYBOARD);
> + tempGrab->type = ButtonPress;
> + tempGrab->detail.exact = stuff->button;
> + tempGrab->grabtype = GRABTYPE_CORE;
> + tempGrab->detail.pMask = NULL;
> + tempGrab->next = NULL;
>
> - if (!DeletePassiveGrabFromList(&tempGrab))
> - return BadAlloc;
> - return Success;
> + if (!DeletePassiveGrabFromList(tempGrab))
> + rc = BadAlloc;
> +
> + FreeGrab(tempGrab);
> + return rc;
> }
>
> /**
More information about the xorg-devel
mailing list