Xi: check cursor and grab_window before attempting the passive grab.
Both values need to fail the request, so we need to check them before looping through the modifier masks. Otherwise, a wrong grab_window will show up in each failed modifier return but not actually cause an error.
This commit is contained in:
parent
5c3e728980
commit
0e089f9ceb
|
@ -85,6 +85,7 @@ ProcXIPassiveGrabDevice(ClientPtr client)
|
||||||
xXIGrabModifierInfo *modifiers_failed;
|
xXIGrabModifierInfo *modifiers_failed;
|
||||||
GrabMask mask;
|
GrabMask mask;
|
||||||
GrabParameters param;
|
GrabParameters param;
|
||||||
|
void *tmp;
|
||||||
|
|
||||||
REQUEST(xXIPassiveGrabDeviceReq);
|
REQUEST(xXIPassiveGrabDeviceReq);
|
||||||
REQUEST_AT_LEAST_SIZE(xXIPassiveGrabDeviceReq);
|
REQUEST_AT_LEAST_SIZE(xXIPassiveGrabDeviceReq);
|
||||||
|
@ -134,6 +135,23 @@ ProcXIPassiveGrabDevice(ClientPtr client)
|
||||||
param.grabWindow = stuff->grab_window;
|
param.grabWindow = stuff->grab_window;
|
||||||
param.cursor = stuff->cursor;
|
param.cursor = stuff->cursor;
|
||||||
|
|
||||||
|
if (stuff->cursor != None)
|
||||||
|
{
|
||||||
|
status = dixLookupResourceByType(&tmp, stuff->cursor,
|
||||||
|
RT_CURSOR, client, DixUseAccess);
|
||||||
|
if (status != Success)
|
||||||
|
{
|
||||||
|
client->errorValue = stuff->cursor;
|
||||||
|
return (status == BadValue) ? BadCursor : status;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
status = dixLookupWindow((WindowPtr*)&tmp, stuff->grab_window, client, DixSetAttrAccess);
|
||||||
|
if (status != Success)
|
||||||
|
return status;
|
||||||
|
|
||||||
|
status = CheckGrabValues(client, ¶m);
|
||||||
|
|
||||||
modifiers = (uint32_t*)&stuff[1] + stuff->mask_len;
|
modifiers = (uint32_t*)&stuff[1] + stuff->mask_len;
|
||||||
modifiers_failed = xcalloc(stuff->num_modifiers, sizeof(xXIGrabModifierInfo));
|
modifiers_failed = xcalloc(stuff->num_modifiers, sizeof(xXIGrabModifierInfo));
|
||||||
if (!modifiers_failed)
|
if (!modifiers_failed)
|
||||||
|
|
Loading…
Reference in New Issue