Xi: fix swapping for XIQueryPointer request/reply handling.
buttons_size is necessary as WriteToClient swaps the buttons_len field, resulting in the wrong number of bytes being written later. Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
This commit is contained in:
parent
f1c856ef90
commit
8e396f2b80
|
@ -64,6 +64,8 @@ SProcXIQueryPointer(ClientPtr client)
|
||||||
|
|
||||||
REQUEST(xXIQueryPointerReq);
|
REQUEST(xXIQueryPointerReq);
|
||||||
swaps(&stuff->length, n);
|
swaps(&stuff->length, n);
|
||||||
|
swaps(&stuff->deviceid, n);
|
||||||
|
swapl(&stuff->win, n);
|
||||||
return (ProcXIQueryPointer(client));
|
return (ProcXIQueryPointer(client));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -77,6 +79,7 @@ ProcXIQueryPointer(ClientPtr client)
|
||||||
SpritePtr pSprite;
|
SpritePtr pSprite;
|
||||||
XkbStatePtr state;
|
XkbStatePtr state;
|
||||||
char *buttons = NULL;
|
char *buttons = NULL;
|
||||||
|
int buttons_size = 0; /* size of buttons array */
|
||||||
|
|
||||||
REQUEST(xXIQueryPointerReq);
|
REQUEST(xXIQueryPointerReq);
|
||||||
REQUEST_SIZE_MATCH(xXIQueryPointerReq);
|
REQUEST_SIZE_MATCH(xXIQueryPointerReq);
|
||||||
|
@ -131,7 +134,8 @@ ProcXIQueryPointer(ClientPtr client)
|
||||||
int i, down;
|
int i, down;
|
||||||
rep.buttons_len = bytes_to_int32(bits_to_bytes(pDev->button->numButtons));
|
rep.buttons_len = bytes_to_int32(bits_to_bytes(pDev->button->numButtons));
|
||||||
rep.length += rep.buttons_len;
|
rep.length += rep.buttons_len;
|
||||||
buttons = xcalloc(rep.buttons_len, 4);
|
buttons_size = rep.buttons_len * 4;
|
||||||
|
buttons = xcalloc(1, buttons_size);
|
||||||
if (!buttons)
|
if (!buttons)
|
||||||
return BadAlloc;
|
return BadAlloc;
|
||||||
|
|
||||||
|
@ -180,7 +184,7 @@ ProcXIQueryPointer(ClientPtr client)
|
||||||
|
|
||||||
WriteReplyToClient(client, sizeof(xXIQueryPointerReply), &rep);
|
WriteReplyToClient(client, sizeof(xXIQueryPointerReply), &rep);
|
||||||
if (buttons)
|
if (buttons)
|
||||||
WriteToClient(client, rep.buttons_len * 4, buttons);
|
WriteToClient(client, buttons_size, buttons);
|
||||||
|
|
||||||
xfree(buttons);
|
xfree(buttons);
|
||||||
|
|
||||||
|
@ -202,6 +206,14 @@ SRepXIQueryPointer(ClientPtr client, int size,
|
||||||
|
|
||||||
swaps(&rep->sequenceNumber, n);
|
swaps(&rep->sequenceNumber, n);
|
||||||
swapl(&rep->length, n);
|
swapl(&rep->length, n);
|
||||||
|
swapl(&rep->root, n);
|
||||||
|
swapl(&rep->child, n);
|
||||||
|
swapl(&rep->root_x, n);
|
||||||
|
swapl(&rep->root_y, n);
|
||||||
|
swapl(&rep->win_x, n);
|
||||||
|
swapl(&rep->win_y, n);
|
||||||
|
swaps(&rep->buttons_len, n);
|
||||||
|
|
||||||
WriteToClient(client, size, (char *)rep);
|
WriteToClient(client, size, (char *)rep);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue