(!1614) xfixes: use stack allocation and static init for reply structs
Canonicalize all reply structures onto stack allocation and static initialization, like already done in most other extension. So make the code easier to understand and allow further simplifications by subsequent commits. Also gaining a little bit efficiency by skipping some heap allocations. Dynamically sized buffers (where the upper bound isn't known), are still allocated on heap. Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
This commit is contained in:
parent
8da50d7554
commit
40f17ebabf
145
xfixes/cursor.c
145
xfixes/cursor.c
|
@ -364,9 +364,7 @@ int
|
||||||
ProcXFixesGetCursorImage(ClientPtr client)
|
ProcXFixesGetCursorImage(ClientPtr client)
|
||||||
{
|
{
|
||||||
/* REQUEST(xXFixesGetCursorImageReq); */
|
/* REQUEST(xXFixesGetCursorImageReq); */
|
||||||
xXFixesGetCursorImageReply *rep;
|
|
||||||
CursorPtr pCursor;
|
CursorPtr pCursor;
|
||||||
CARD32 *image;
|
|
||||||
int npixels, width, height, rc, x, y;
|
int npixels, width, height, rc, x, y;
|
||||||
|
|
||||||
REQUEST_SIZE_MATCH(xXFixesGetCursorImageReq);
|
REQUEST_SIZE_MATCH(xXFixesGetCursorImageReq);
|
||||||
|
@ -381,39 +379,41 @@ ProcXFixesGetCursorImage(ClientPtr client)
|
||||||
width = pCursor->bits->width;
|
width = pCursor->bits->width;
|
||||||
height = pCursor->bits->height;
|
height = pCursor->bits->height;
|
||||||
npixels = width * height;
|
npixels = width * height;
|
||||||
rep = calloc(1,
|
|
||||||
sizeof(xXFixesGetCursorImageReply) + npixels * sizeof(CARD32));
|
CARD32 *image = calloc(npixels, sizeof(CARD32));
|
||||||
if (!rep)
|
if (!image)
|
||||||
return BadAlloc;
|
return BadAlloc;
|
||||||
|
|
||||||
rep->type = X_Reply;
|
|
||||||
rep->sequenceNumber = client->sequence;
|
|
||||||
rep->length = npixels;
|
|
||||||
rep->width = width;
|
|
||||||
rep->height = height;
|
|
||||||
rep->x = x;
|
|
||||||
rep->y = y;
|
|
||||||
rep->xhot = pCursor->bits->xhot;
|
|
||||||
rep->yhot = pCursor->bits->yhot;
|
|
||||||
rep->cursorSerial = pCursor->serialNumber;
|
|
||||||
|
|
||||||
image = (CARD32 *) (rep + 1);
|
|
||||||
CopyCursorToImage(pCursor, image);
|
CopyCursorToImage(pCursor, image);
|
||||||
|
|
||||||
|
xXFixesGetCursorImageReply rep = {
|
||||||
|
.type = X_Reply,
|
||||||
|
.sequenceNumber = client->sequence,
|
||||||
|
.length = npixels,
|
||||||
|
.width = width,
|
||||||
|
.height = height,
|
||||||
|
.x = x,
|
||||||
|
.y = y,
|
||||||
|
.xhot = pCursor->bits->xhot,
|
||||||
|
.yhot = pCursor->bits->yhot,
|
||||||
|
.cursorSerial = pCursor->serialNumber,
|
||||||
|
};
|
||||||
|
|
||||||
if (client->swapped) {
|
if (client->swapped) {
|
||||||
swaps(&rep->sequenceNumber);
|
swaps(&rep.sequenceNumber);
|
||||||
swapl(&rep->length);
|
swapl(&rep.length);
|
||||||
swaps(&rep->x);
|
swaps(&rep.x);
|
||||||
swaps(&rep->y);
|
swaps(&rep.y);
|
||||||
swaps(&rep->width);
|
swaps(&rep.width);
|
||||||
swaps(&rep->height);
|
swaps(&rep.height);
|
||||||
swaps(&rep->xhot);
|
swaps(&rep.xhot);
|
||||||
swaps(&rep->yhot);
|
swaps(&rep.yhot);
|
||||||
swapl(&rep->cursorSerial);
|
swapl(&rep.cursorSerial);
|
||||||
SwapLongs(image, npixels);
|
SwapLongs(image, npixels);
|
||||||
}
|
}
|
||||||
WriteToClient(client,
|
WriteToClient(client, sizeof(xXFixesGetCursorImageReply), &rep);
|
||||||
sizeof(xXFixesGetCursorImageReply) + (npixels << 2), rep);
|
WriteToClient(client, npixels * sizeof(CARD32), image);
|
||||||
free(rep);
|
free(image);
|
||||||
return Success;
|
return Success;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -460,10 +460,9 @@ SProcXFixesSetCursorName(ClientPtr client)
|
||||||
int
|
int
|
||||||
ProcXFixesGetCursorName(ClientPtr client)
|
ProcXFixesGetCursorName(ClientPtr client)
|
||||||
{
|
{
|
||||||
CursorPtr pCursor;
|
|
||||||
xXFixesGetCursorNameReply reply;
|
|
||||||
|
|
||||||
REQUEST(xXFixesGetCursorNameReq);
|
REQUEST(xXFixesGetCursorNameReq);
|
||||||
|
|
||||||
|
CursorPtr pCursor;
|
||||||
const char *str;
|
const char *str;
|
||||||
int len;
|
int len;
|
||||||
|
|
||||||
|
@ -475,7 +474,7 @@ ProcXFixesGetCursorName(ClientPtr client)
|
||||||
str = "";
|
str = "";
|
||||||
len = strlen(str);
|
len = strlen(str);
|
||||||
|
|
||||||
reply = (xXFixesGetCursorNameReply) {
|
xXFixesGetCursorNameReply rep = {
|
||||||
.type = X_Reply,
|
.type = X_Reply,
|
||||||
.sequenceNumber = client->sequence,
|
.sequenceNumber = client->sequence,
|
||||||
.length = bytes_to_int32(len),
|
.length = bytes_to_int32(len),
|
||||||
|
@ -483,12 +482,12 @@ ProcXFixesGetCursorName(ClientPtr client)
|
||||||
.nbytes = len
|
.nbytes = len
|
||||||
};
|
};
|
||||||
if (client->swapped) {
|
if (client->swapped) {
|
||||||
swaps(&reply.sequenceNumber);
|
swaps(&rep.sequenceNumber);
|
||||||
swapl(&reply.length);
|
swapl(&rep.length);
|
||||||
swapl(&reply.atom);
|
swapl(&rep.atom);
|
||||||
swaps(&reply.nbytes);
|
swaps(&rep.nbytes);
|
||||||
}
|
}
|
||||||
WriteReplyToClient(client, sizeof(xXFixesGetCursorNameReply), &reply);
|
WriteReplyToClient(client, sizeof(xXFixesGetCursorNameReply), &rep);
|
||||||
WriteToClient(client, len, str);
|
WriteToClient(client, len, str);
|
||||||
|
|
||||||
return Success;
|
return Success;
|
||||||
|
@ -509,12 +508,10 @@ int
|
||||||
ProcXFixesGetCursorImageAndName(ClientPtr client)
|
ProcXFixesGetCursorImageAndName(ClientPtr client)
|
||||||
{
|
{
|
||||||
/* REQUEST(xXFixesGetCursorImageAndNameReq); */
|
/* REQUEST(xXFixesGetCursorImageAndNameReq); */
|
||||||
xXFixesGetCursorImageAndNameReply *rep;
|
|
||||||
CursorPtr pCursor;
|
CursorPtr pCursor;
|
||||||
CARD32 *image;
|
|
||||||
int npixels;
|
int npixels;
|
||||||
const char *name;
|
const char *name;
|
||||||
int nbytes, nbytesRound;
|
int nbytes;
|
||||||
int width, height;
|
int width, height;
|
||||||
int rc, x, y;
|
int rc, x, y;
|
||||||
|
|
||||||
|
@ -532,45 +529,47 @@ ProcXFixesGetCursorImageAndName(ClientPtr client)
|
||||||
npixels = width * height;
|
npixels = width * height;
|
||||||
name = pCursor->name ? NameForAtom(pCursor->name) : "";
|
name = pCursor->name ? NameForAtom(pCursor->name) : "";
|
||||||
nbytes = strlen(name);
|
nbytes = strlen(name);
|
||||||
nbytesRound = pad_to_int32(nbytes);
|
|
||||||
rep = calloc(1, sizeof(xXFixesGetCursorImageAndNameReply) +
|
// pixmap plus name (padded to 4 bytes)
|
||||||
npixels * sizeof(CARD32) + nbytesRound);
|
CARD32 *image = calloc(npixels + bytes_to_int32(nbytes), sizeof(CARD32));
|
||||||
if (!rep)
|
if (!image)
|
||||||
return BadAlloc;
|
return BadAlloc;
|
||||||
|
|
||||||
rep->type = X_Reply;
|
|
||||||
rep->sequenceNumber = client->sequence;
|
|
||||||
rep->length = npixels + bytes_to_int32(nbytesRound);
|
|
||||||
rep->width = width;
|
|
||||||
rep->height = height;
|
|
||||||
rep->x = x;
|
|
||||||
rep->y = y;
|
|
||||||
rep->xhot = pCursor->bits->xhot;
|
|
||||||
rep->yhot = pCursor->bits->yhot;
|
|
||||||
rep->cursorSerial = pCursor->serialNumber;
|
|
||||||
rep->cursorName = pCursor->name;
|
|
||||||
rep->nbytes = nbytes;
|
|
||||||
|
|
||||||
image = (CARD32 *) (rep + 1);
|
|
||||||
CopyCursorToImage(pCursor, image);
|
CopyCursorToImage(pCursor, image);
|
||||||
memcpy((image + npixels), name, nbytes);
|
memcpy((image + npixels), name, nbytes);
|
||||||
|
|
||||||
|
xXFixesGetCursorImageAndNameReply rep = {
|
||||||
|
.type = X_Reply,
|
||||||
|
.sequenceNumber = client->sequence,
|
||||||
|
.length = bytes_to_int32(sizeof(image)),
|
||||||
|
.width = width,
|
||||||
|
.height = height,
|
||||||
|
.x = x,
|
||||||
|
.y = y,
|
||||||
|
.xhot = pCursor->bits->xhot,
|
||||||
|
.yhot = pCursor->bits->yhot,
|
||||||
|
.cursorSerial = pCursor->serialNumber,
|
||||||
|
.cursorName = pCursor->name,
|
||||||
|
.nbytes = nbytes,
|
||||||
|
};
|
||||||
|
|
||||||
if (client->swapped) {
|
if (client->swapped) {
|
||||||
swaps(&rep->sequenceNumber);
|
swaps(&rep.sequenceNumber);
|
||||||
swapl(&rep->length);
|
swapl(&rep.length);
|
||||||
swaps(&rep->x);
|
swaps(&rep.x);
|
||||||
swaps(&rep->y);
|
swaps(&rep.y);
|
||||||
swaps(&rep->width);
|
swaps(&rep.width);
|
||||||
swaps(&rep->height);
|
swaps(&rep.height);
|
||||||
swaps(&rep->xhot);
|
swaps(&rep.xhot);
|
||||||
swaps(&rep->yhot);
|
swaps(&rep.yhot);
|
||||||
swapl(&rep->cursorSerial);
|
swapl(&rep.cursorSerial);
|
||||||
swapl(&rep->cursorName);
|
swapl(&rep.cursorName);
|
||||||
swaps(&rep->nbytes);
|
swaps(&rep.nbytes);
|
||||||
SwapLongs(image, npixels);
|
SwapLongs(image, npixels);
|
||||||
}
|
}
|
||||||
WriteToClient(client, sizeof(xXFixesGetCursorImageAndNameReply) +
|
WriteToClient(client, sizeof(xXFixesGetCursorImageAndNameReply), &rep);
|
||||||
(npixels << 2) + nbytesRound, rep);
|
WriteToClient(client, sizeof(image), image);
|
||||||
free(rep);
|
free(image);
|
||||||
return Success;
|
return Success;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -92,21 +92,20 @@ int
|
||||||
ProcXFixesGetClientDisconnectMode(ClientPtr client)
|
ProcXFixesGetClientDisconnectMode(ClientPtr client)
|
||||||
{
|
{
|
||||||
ClientDisconnectPtr pDisconnect = GetClientDisconnect(client);
|
ClientDisconnectPtr pDisconnect = GetClientDisconnect(client);
|
||||||
xXFixesGetClientDisconnectModeReply reply;
|
|
||||||
|
|
||||||
REQUEST_SIZE_MATCH(xXFixesGetClientDisconnectModeReq);
|
REQUEST_SIZE_MATCH(xXFixesGetClientDisconnectModeReq);
|
||||||
|
|
||||||
reply = (xXFixesGetClientDisconnectModeReply) {
|
xXFixesGetClientDisconnectModeReply rep = {
|
||||||
.type = X_Reply,
|
.type = X_Reply,
|
||||||
.sequenceNumber = client->sequence,
|
.sequenceNumber = client->sequence,
|
||||||
.length = 0,
|
.length = 0,
|
||||||
.disconnect_mode = pDisconnect->disconnect_mode,
|
.disconnect_mode = pDisconnect->disconnect_mode,
|
||||||
};
|
};
|
||||||
if (client->swapped) {
|
if (client->swapped) {
|
||||||
swaps(&reply.sequenceNumber);
|
swaps(&rep.sequenceNumber);
|
||||||
swapl(&reply.disconnect_mode);
|
swapl(&rep.disconnect_mode);
|
||||||
}
|
}
|
||||||
WriteToClient(client, sizeof(xXFixesGetClientDisconnectModeReply), &reply);
|
WriteToClient(client, sizeof(xXFixesGetClientDisconnectModeReply), &rep);
|
||||||
|
|
||||||
return Success;
|
return Success;
|
||||||
}
|
}
|
||||||
|
|
|
@ -533,8 +533,6 @@ int
|
||||||
ProcXFixesFetchRegion(ClientPtr client)
|
ProcXFixesFetchRegion(ClientPtr client)
|
||||||
{
|
{
|
||||||
RegionPtr pRegion;
|
RegionPtr pRegion;
|
||||||
xXFixesFetchRegionReply *reply;
|
|
||||||
xRectangle *pRect;
|
|
||||||
BoxPtr pExtent;
|
BoxPtr pExtent;
|
||||||
BoxPtr pBox;
|
BoxPtr pBox;
|
||||||
int i, nBox;
|
int i, nBox;
|
||||||
|
@ -548,37 +546,39 @@ ProcXFixesFetchRegion(ClientPtr client)
|
||||||
pBox = RegionRects(pRegion);
|
pBox = RegionRects(pRegion);
|
||||||
nBox = RegionNumRects(pRegion);
|
nBox = RegionNumRects(pRegion);
|
||||||
|
|
||||||
reply = calloc(sizeof(xXFixesFetchRegionReply) + nBox * sizeof(xRectangle),
|
xRectangle *pRect = calloc(nBox, sizeof(xRectangle));
|
||||||
1);
|
if (!pRect)
|
||||||
if (!reply)
|
|
||||||
return BadAlloc;
|
return BadAlloc;
|
||||||
reply->type = X_Reply;
|
|
||||||
reply->sequenceNumber = client->sequence;
|
|
||||||
reply->length = nBox << 1;
|
|
||||||
reply->x = pExtent->x1;
|
|
||||||
reply->y = pExtent->y1;
|
|
||||||
reply->width = pExtent->x2 - pExtent->x1;
|
|
||||||
reply->height = pExtent->y2 - pExtent->y1;
|
|
||||||
|
|
||||||
pRect = (xRectangle *) (reply + 1);
|
|
||||||
for (i = 0; i < nBox; i++) {
|
for (i = 0; i < nBox; i++) {
|
||||||
pRect[i].x = pBox[i].x1;
|
pRect[i].x = pBox[i].x1;
|
||||||
pRect[i].y = pBox[i].y1;
|
pRect[i].y = pBox[i].y1;
|
||||||
pRect[i].width = pBox[i].x2 - pBox[i].x1;
|
pRect[i].width = pBox[i].x2 - pBox[i].x1;
|
||||||
pRect[i].height = pBox[i].y2 - pBox[i].y1;
|
pRect[i].height = pBox[i].y2 - pBox[i].y1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
xXFixesFetchRegionReply rep = {
|
||||||
|
.type = X_Reply,
|
||||||
|
.sequenceNumber = client->sequence,
|
||||||
|
.length = nBox << 1,
|
||||||
|
.x = pExtent->x1,
|
||||||
|
.y = pExtent->y1,
|
||||||
|
.width = pExtent->x2 - pExtent->x1,
|
||||||
|
.height = pExtent->y2 - pExtent->y1,
|
||||||
|
};
|
||||||
|
|
||||||
if (client->swapped) {
|
if (client->swapped) {
|
||||||
swaps(&reply->sequenceNumber);
|
swaps(&rep.sequenceNumber);
|
||||||
swapl(&reply->length);
|
swapl(&rep.length);
|
||||||
swaps(&reply->x);
|
swaps(&rep.x);
|
||||||
swaps(&reply->y);
|
swaps(&rep.y);
|
||||||
swaps(&reply->width);
|
swaps(&rep.width);
|
||||||
swaps(&reply->height);
|
swaps(&rep.height);
|
||||||
SwapShorts((INT16 *) pRect, nBox * 4);
|
SwapShorts((INT16 *) pRect, nBox * 4);
|
||||||
}
|
}
|
||||||
WriteToClient(client, sizeof(xXFixesFetchRegionReply) +
|
WriteToClient(client, sizeof(xXFixesFetchRegionReply), &rep);
|
||||||
nBox * sizeof(xRectangle), (char *) reply);
|
WriteToClient(client, sizeof(pRect), pRect);
|
||||||
free(reply);
|
free(pRect);
|
||||||
return Success;
|
return Success;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue