diff --git a/render/render.c b/render/render.c index e4699ba87b..586a041d8c 100644 --- a/render/render.c +++ b/render/render.c @@ -98,7 +98,6 @@ static int ProcRenderCreateConicalGradient(ClientPtr pClient); static int ProcRenderDispatch(ClientPtr pClient); -static int SProcRenderCreateRadialGradient(ClientPtr pClient); static int SProcRenderCreateConicalGradient(ClientPtr pClient); static int SProcRenderDispatch(ClientPtr pClient); @@ -177,7 +176,8 @@ int (*SProcRenderVector[RenderNumberRequests]) (ClientPtr) = { ProcRenderAddTraps, ProcRenderCreateSolidFill, ProcRenderCreateLinearGradient, - SProcRenderCreateRadialGradient, SProcRenderCreateConicalGradient}; + ProcRenderCreateRadialGradient, + SProcRenderCreateConicalGradient}; int RenderErrBase; static DevPrivateKeyRec RenderClientPrivateKeyRec; @@ -1832,7 +1832,8 @@ SingleRenderCreateLinearGradient(ClientPtr client, xRenderCreateLinearGradientRe } static int -SingleRenderCreateRadialGradient(ClientPtr client) +SingleRenderCreateRadialGradient(ClientPtr client, + xRenderCreateRadialGradientReq *stuff) { PicturePtr pPicture; int len; @@ -1840,10 +1841,6 @@ SingleRenderCreateRadialGradient(ClientPtr client) xFixed *stops; xRenderColor *colors; - REQUEST(xRenderCreateRadialGradientReq); - - REQUEST_AT_LEAST_SIZE(xRenderCreateRadialGradientReq); - LEGAL_NEW_RESOURCE(stuff->pid, client); len = (client->req_len << 2) - sizeof(xRenderCreateRadialGradientReq); @@ -1940,34 +1937,6 @@ swapStops(void *stuff, int num) } } -static int _X_COLD -SProcRenderCreateRadialGradient(ClientPtr client) -{ - int len; - - REQUEST(xRenderCreateRadialGradientReq); - REQUEST_AT_LEAST_SIZE(xRenderCreateRadialGradientReq); - - swapl(&stuff->pid); - swapl(&stuff->inner.x); - swapl(&stuff->inner.y); - swapl(&stuff->outer.x); - swapl(&stuff->outer.y); - swapl(&stuff->inner_radius); - swapl(&stuff->outer_radius); - swapl(&stuff->nStops); - - len = (client->req_len << 2) - sizeof(xRenderCreateRadialGradientReq); - if (stuff->nStops > UINT32_MAX / (sizeof(xFixed) + sizeof(xRenderColor))) - return BadLength; - if (len != stuff->nStops * (sizeof(xFixed) + sizeof(xRenderColor))) - return BadLength; - - swapStops(stuff + 1, stuff->nStops); - - return ProcRenderCreateRadialGradient(client); -} - static int _X_COLD SProcRenderCreateConicalGradient(ClientPtr client) { @@ -2583,14 +2552,12 @@ PanoramiXRenderCreateLinearGradient(ClientPtr client, } static int -PanoramiXRenderCreateRadialGradient(ClientPtr client) +PanoramiXRenderCreateRadialGradient(ClientPtr client, + xRenderCreateRadialGradientReq *stuff) { - REQUEST(xRenderCreateRadialGradientReq); PanoramiXRes *newPict; int result = Success; - REQUEST_AT_LEAST_SIZE(xRenderCreateRadialGradientReq); - if (!(newPict = calloc(1, sizeof(PanoramiXRes)))) return BadAlloc; @@ -2600,7 +2567,7 @@ PanoramiXRenderCreateRadialGradient(ClientPtr client) XINERAMA_FOR_EACH_SCREEN_BACKWARD({ stuff->pid = newPict->info[walkScreenIdx].id; - result = SingleRenderCreateRadialGradient(client); + result = SingleRenderCreateRadialGradient(client, stuff); if (result != Success) break; }); @@ -3094,11 +3061,33 @@ ProcRenderCreateLinearGradient(ClientPtr client) static int ProcRenderCreateRadialGradient(ClientPtr client) { + REQUEST(xRenderCreateRadialGradientReq); + REQUEST_AT_LEAST_SIZE(xRenderCreateRadialGradientReq); + + if (client->swapped) { + swapl(&stuff->pid); + swapl(&stuff->inner.x); + swapl(&stuff->inner.y); + swapl(&stuff->outer.x); + swapl(&stuff->outer.y); + swapl(&stuff->inner_radius); + swapl(&stuff->outer_radius); + swapl(&stuff->nStops); + + int len = (client->req_len << 2) - sizeof(xRenderCreateRadialGradientReq); + if (stuff->nStops > UINT32_MAX / (sizeof(xFixed) + sizeof(xRenderColor))) + return BadLength; + if (len != stuff->nStops * (sizeof(xFixed) + sizeof(xRenderColor))) + return BadLength; + + swapStops(stuff + 1, stuff->nStops); + } + #ifdef XINERAMA - return (usePanoramiX ? PanoramiXRenderCreateRadialGradient(client) - : SingleRenderCreateRadialGradient(client)); + return (usePanoramiX ? PanoramiXRenderCreateRadialGradient(client, stuff) + : SingleRenderCreateRadialGradient(client, stuff)); #else - return SingleRenderCreateRadialGradient(client); + return SingleRenderCreateRadialGradient(client, stuff); #endif }