diff --git a/Xi/xiproperty.c b/Xi/xiproperty.c index 133e2ffe99..da354f070d 100644 --- a/Xi/xiproperty.c +++ b/Xi/xiproperty.c @@ -36,6 +36,7 @@ #include "dix/exevents_priv.h" #include "dix/extension_priv.h" #include "dix/input_priv.h" +#include "dix/rpcbuf_priv.h" #include "dix.h" #include "inputstr.h" @@ -986,23 +987,26 @@ ProcXGetDeviceProperty(ClientPtr client) swapl(&rep.bytesAfter); swapl(&rep.nItems); } - WriteToClient(client, sizeof(xGenericReply), &rep); + + x_rpcbuf_t rpcbuf = { .swapped = client->swapped, .err_clear = TRUE }; if (length) { - switch (rep.format) { + switch (format) { case 32: - client->pSwapReplyFunc = (ReplySwapPtr) CopySwap32Write; + x_rpcbuf_write_CARD32s(&rpcbuf, (CARD32*)data, length / 4); break; case 16: - client->pSwapReplyFunc = (ReplySwapPtr) CopySwap16Write; + x_rpcbuf_write_CARD16s(&rpcbuf, (CARD16*)data, length / 2); break; default: - client->pSwapReplyFunc = (ReplySwapPtr) WriteToClient; + x_rpcbuf_write_CARD8s(&rpcbuf, (CARD8*)data, length); break; } - WriteSwappedDataToClient(client, length, data); } + if (rpcbuf.error) + return BadAlloc; + /* delete the Property */ if (stuff->delete && (rep.bytesAfter == 0)) { XIPropertyPtr prop, *prev; @@ -1016,6 +1020,9 @@ ProcXGetDeviceProperty(ClientPtr client) } } } + + WriteToClient(client, sizeof(xGenericReply), &rep); + WriteRpcbufToClient(client, &rpcbuf); return Success; }