From 0b5ecabfb803cd820338fb0364521fe39b05578b Mon Sep 17 00:00:00 2001 From: Julien Cristau Date: Wed, 26 Nov 2008 21:19:55 +0100 Subject: randr: add swapped dispatch for RR[GS]etCrtcTransform Fix a memory leak in ProcRRGetCrtcTransform() while I'm at it. Signed-off-by: Julien Cristau Cc: Keith Packard --- randr/rrcrtc.c | 6 +++--- randr/rrsdispatch.c | 29 ++++++++++++++++++++++------- 2 files changed, 25 insertions(+), 10 deletions(-) diff --git a/randr/rrcrtc.c b/randr/rrcrtc.c index 5d270ce12..90d93b513 100644 --- a/randr/rrcrtc.c +++ b/randr/rrcrtc.c @@ -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; } diff --git a/randr/rrsdispatch.c b/randr/rrsdispatch.c index 5a6dab5bf..d356ab049 100644 --- a/randr/rrsdispatch.c +++ b/randr/rrsdispatch.c @@ -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) = { -- cgit v1.2.3