randr: add swapped dispatch for RR[GS]etCrtcTransform

Fix a memory leak in ProcRRGetCrtcTransform() while I'm at it.

Signed-off-by: Julien Cristau <jcristau@debian.org>
Cc: Keith Packard <keithp@keithp.com>
This commit is contained in:
Julien Cristau 2008-11-26 21:19:55 +01:00
parent 110a71d11a
commit 0b5ecabfb8
2 changed files with 25 additions and 10 deletions

View File

@ -1150,8 +1150,7 @@ transform_filter_encode (ClientPtr client, char *output,
if (client->swapped) {
swaps (nbytesFilter, n);
swaps (nparamsFilter, n);
SwapLongs ((CARD32 *) (output + nbytes),
nparams * sizeof (xFixed));
SwapLongs ((CARD32 *) (output + nbytes), nparams);
}
nbytes += nparams * sizeof (xFixed);
return nbytes;
@ -1162,7 +1161,7 @@ transform_encode (ClientPtr client, xRenderTransform *wire, PictTransform *pict)
{
xRenderTransform_from_PictTransform (wire, pict);
if (client->swapped)
SwapLongs ((CARD32 *) wire, sizeof (xRenderTransform));
SwapLongs ((CARD32 *) wire, sizeof (xRenderTransform) >> 2);
}
int
@ -1214,5 +1213,6 @@ ProcRRGetCrtcTransform (ClientPtr client)
swapl (&reply->length, n);
}
WriteToClient (client, sizeof (xRRGetCrtcTransformReply) + nextra, (char *) reply);
xfree(reply);
return client->noClientException;
}

View File

@ -367,21 +367,36 @@ SProcRRSetCrtcGamma (ClientPtr client)
static int
SProcRRSetCrtcTransform (ClientPtr client)
{
int n, nparams;
char *filter;
CARD32 *params;
REQUEST(xRRSetCrtcTransformReq);
REQUEST_SIZE_MATCH(xRRSetCrtcTransformReq);
(void) stuff;
return BadImplementation;
REQUEST_AT_LEAST_SIZE(xRRSetCrtcTransformReq);
swaps(&stuff->length, n);
swapl(&stuff->crtc, n);
SwapLongs((CARD32 *)&stuff->transform, (sizeof(xRenderTransform)) >> 2);
swaps(&stuff->nbytesFilter, n);
filter = (char *)(stuff + 1);
params = (CARD32 *) (filter + ((stuff->nbytesFilter + 3) & ~3));
nparams = ((CARD32 *) stuff + client->req_len) - params;
if (nparams < 0)
return BadLength;
SwapLongs(params, nparams);
return (*ProcRandrVector[stuff->randrReqType]) (client);
}
static int
SProcRRGetCrtcTransform (ClientPtr client)
{
int n;
REQUEST(xRRGetCrtcTransformReq);
REQUEST_SIZE_MATCH(xRRGetCrtcTransformReq);
(void) stuff;
return BadImplementation;
swaps(&stuff->length, n);
swapl(&stuff->crtc, n);
return (*ProcRandrVector[stuff->randrReqType]) (client);
}
int (*SProcRandrVector[RRNumberRequests])(ClientPtr) = {