Xi: fix modifier offset in XIPassiveGrab swapping function
The request is followed by mask_len 4-byte units, then followed by the actual modifiers. Also fix up the swapping test, which had the same issue. Reported-by: Alan Coopersmith <alan.coopersmith@oracle.com> Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net> Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com>
This commit is contained in:
		
							parent
							
								
									c1ce807d9f
								
							
						
					
					
						commit
						76b3be75b6
					
				|  | @ -63,7 +63,7 @@ SProcXIPassiveGrabDevice(ClientPtr client) | ||||||
|     swaps(&stuff->mask_len); |     swaps(&stuff->mask_len); | ||||||
|     swaps(&stuff->num_modifiers); |     swaps(&stuff->num_modifiers); | ||||||
| 
 | 
 | ||||||
|     mods = (uint32_t *) &stuff[1]; |     mods = (uint32_t *) &stuff[1] + stuff->mask_len; | ||||||
| 
 | 
 | ||||||
|     for (i = 0; i < stuff->num_modifiers; i++, mods++) { |     for (i = 0; i < stuff->num_modifiers; i++, mods++) { | ||||||
|         swapl(mods); |         swapl(mods); | ||||||
|  |  | ||||||
|  | @ -137,6 +137,7 @@ request_XIPassiveGrabDevice(ClientPtr client, xXIPassiveGrabDeviceReq * req, | ||||||
| { | { | ||||||
|     int rc; |     int rc; | ||||||
|     int local_modifiers; |     int local_modifiers; | ||||||
|  |     int mask_len; | ||||||
| 
 | 
 | ||||||
|     rc = ProcXIPassiveGrabDevice(&client_request); |     rc = ProcXIPassiveGrabDevice(&client_request); | ||||||
|     assert(rc == error); |     assert(rc == error); | ||||||
|  | @ -153,10 +154,11 @@ request_XIPassiveGrabDevice(ClientPtr client, xXIPassiveGrabDeviceReq * req, | ||||||
|     swaps(&req->deviceid); |     swaps(&req->deviceid); | ||||||
|     local_modifiers = req->num_modifiers; |     local_modifiers = req->num_modifiers; | ||||||
|     swaps(&req->num_modifiers); |     swaps(&req->num_modifiers); | ||||||
|  |     mask_len = req->mask_len; | ||||||
|     swaps(&req->mask_len); |     swaps(&req->mask_len); | ||||||
| 
 | 
 | ||||||
|     while (local_modifiers--) { |     while (local_modifiers--) { | ||||||
|         CARD32 *mod = ((CARD32 *) (req + 1)) + local_modifiers; |         CARD32 *mod = (CARD32 *) (req + 1) + mask_len + local_modifiers; | ||||||
| 
 | 
 | ||||||
|         swapl(mod); |         swapl(mod); | ||||||
|     } |     } | ||||||
|  | @ -228,6 +230,11 @@ test_XIPassiveGrabDevice(void) | ||||||
|     request->detail = XIAnyButton; |     request->detail = XIAnyButton; | ||||||
|     request_XIPassiveGrabDevice(&client_request, request, Success, 0); |     request_XIPassiveGrabDevice(&client_request, request, Success, 0); | ||||||
| 
 | 
 | ||||||
|  |     /* Set a few random masks to make sure we handle modifiers correctly */ | ||||||
|  |     SetBit(mask, XI_ButtonPress); | ||||||
|  |     SetBit(mask, XI_KeyPress); | ||||||
|  |     SetBit(mask, XI_Enter); | ||||||
|  | 
 | ||||||
|     /* some modifiers */ |     /* some modifiers */ | ||||||
|     request->num_modifiers = N_MODS; |     request->num_modifiers = N_MODS; | ||||||
|     request->length += N_MODS; |     request->length += N_MODS; | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue