diff --git a/Xi/extinit.c b/Xi/extinit.c index 02c8f83041..3138f0564c 100644 --- a/Xi/extinit.c +++ b/Xi/extinit.c @@ -444,7 +444,7 @@ SProcIDispatch(ClientPtr client) case X_XIGetClientPointer: return ProcXIGetClientPointer(client); case X_XISelectEvents: - return SProcXISelectEvents(client); + return ProcXISelectEvents(client); case X_XIQueryVersion: return ProcXIQueryVersion(client); case X_XIQueryDevice: @@ -472,7 +472,7 @@ SProcIDispatch(ClientPtr client) case X_XIGetProperty: return ProcXIGetProperty(client); case X_XIGetSelectedEvents: - return SProcXIGetSelectedEvents(client); + return ProcXIGetSelectedEvents(client); case X_XIBarrierReleasePointer: return ProcXIBarrierReleasePointer(client); default: diff --git a/Xi/handlers.h b/Xi/handlers.h index 2504e17c9e..9e86b99281 100644 --- a/Xi/handlers.h +++ b/Xi/handlers.h @@ -69,7 +69,4 @@ int ProcXUngrabDeviceButton(ClientPtr client); int ProcXUngrabDevice(ClientPtr client); int ProcXUngrabDeviceKey(ClientPtr client); -int SProcXIGetSelectedEvents(ClientPtr client); -int SProcXISelectEvents(ClientPtr client); - #endif /* _XSERVER_XI_HANDLERS_H */ diff --git a/Xi/xiselectev.c b/Xi/xiselectev.c index b2af7410a3..91ead5f45b 100644 --- a/Xi/xiselectev.c +++ b/Xi/xiselectev.c @@ -113,42 +113,32 @@ XICheckInvalidMaskBits(ClientPtr client, unsigned char *mask, int len) return Success; } -int _X_COLD -SProcXISelectEvents(ClientPtr client) -{ - int i; - int len; - xXIEventMask *evmask; - - REQUEST(xXISelectEventsReq); - REQUEST_AT_LEAST_SIZE(xXISelectEventsReq); - swapl(&stuff->win); - swaps(&stuff->num_masks); - - len = client->req_len - bytes_to_int32(sizeof(xXISelectEventsReq)); - evmask = (xXIEventMask *) &stuff[1]; - for (i = 0; i < stuff->num_masks; i++) { - if (len < bytes_to_int32(sizeof(xXIEventMask))) - return BadLength; - len -= bytes_to_int32(sizeof(xXIEventMask)); - swaps(&evmask->deviceid); - swaps(&evmask->mask_len); - if (len < evmask->mask_len) - return BadLength; - len -= evmask->mask_len; - evmask = - (xXIEventMask *) (((char *) &evmask[1]) + evmask->mask_len * 4); - } - - return (ProcXISelectEvents(client)); -} - int ProcXISelectEvents(ClientPtr client) { REQUEST(xXISelectEventsReq); REQUEST_AT_LEAST_SIZE(xXISelectEventsReq); + if (client->swapped) { + swapl(&stuff->win); + swaps(&stuff->num_masks); + + int len = client->req_len - bytes_to_int32(sizeof(xXISelectEventsReq)); + xXIEventMask *evmask = (xXIEventMask *) &stuff[1]; + for (int i = 0; i < stuff->num_masks; i++) { + if (len < bytes_to_int32(sizeof(xXIEventMask))) + return BadLength; + len -= bytes_to_int32(sizeof(xXIEventMask)); + swaps(&evmask->deviceid); + swaps(&evmask->mask_len); + if (len < evmask->mask_len) + return BadLength; + len -= evmask->mask_len; + evmask = + (xXIEventMask *) (((char *) &evmask[1]) + evmask->mask_len * 4); + } + } + if (stuff->num_masks == 0) return BadValue; @@ -327,28 +317,21 @@ ProcXISelectEvents(ClientPtr client) return Success; } -int _X_COLD -SProcXIGetSelectedEvents(ClientPtr client) -{ - REQUEST(xXIGetSelectedEventsReq); - REQUEST_SIZE_MATCH(xXIGetSelectedEventsReq); - swapl(&stuff->win); - - return (ProcXIGetSelectedEvents(client)); -} - int ProcXIGetSelectedEvents(ClientPtr client) { + REQUEST(xXIGetSelectedEventsReq); + REQUEST_SIZE_MATCH(xXIGetSelectedEventsReq); + + if (client->swapped) + swapl(&stuff->win); + int rc, i; WindowPtr win; OtherInputMasks *masks; InputClientsPtr others = NULL; DeviceIntPtr dev; - REQUEST(xXIGetSelectedEventsReq); - REQUEST_SIZE_MATCH(xXIGetSelectedEventsReq); - rc = dixLookupWindow(&win, stuff->win, client, DixGetAttrAccess); if (rc != Success) return rc; diff --git a/test/xi2/protocol-xigetselectedevents.c b/test/xi2/protocol-xigetselectedevents.c index 648b43c403..84d85854ba 100644 --- a/test/xi2/protocol-xigetselectedevents.c +++ b/test/xi2/protocol-xigetselectedevents.c @@ -151,7 +151,7 @@ request_XIGetSelectedEvents(xXIGetSelectedEventsReq * req, int error) */ swapl(&req->win); - rc = SProcXIGetSelectedEvents(&client); + rc = ProcXIGetSelectedEvents(&client); assert(rc == error); } diff --git a/test/xi2/protocol-xiselectevents.c b/test/xi2/protocol-xiselectevents.c index b3692bc08a..7e6b3b278c 100644 --- a/test/xi2/protocol-xiselectevents.c +++ b/test/xi2/protocol-xiselectevents.c @@ -121,7 +121,7 @@ request_XISelectEvent(xXISelectEventsReq * req, int error) swapl(&req->win); swaps(&req->num_masks); - rc = SProcXISelectEvents(&client); + rc = ProcXISelectEvents(&client); assert(rc == error); }