mirror of
https://gitlab.freedesktop.org/xorg/xserver.git
synced 2026-01-09 08:50:19 +01:00
CVE-2008-2362 - RENDER Extension memory corruption
Integer overflows can occur in the code validating the parameters for
the SProcRenderCreateLinearGradient, SProcRenderCreateRadialGradient
and SProcRenderCreateConicalGradient functions, leading to memory
corruption by swapping bytes outside of the intended request
parameters.
(cherry picked from commit 9171206db3)
This commit is contained in:
parent
8259d19f71
commit
edd2cac9fa
1 changed files with 12 additions and 4 deletions
|
|
@ -1987,6 +1987,8 @@ static int ProcRenderCreateLinearGradient (ClientPtr client)
|
|||
LEGAL_NEW_RESOURCE(stuff->pid, client);
|
||||
|
||||
len = (client->req_len << 2) - sizeof(xRenderCreateLinearGradientReq);
|
||||
if (stuff->nStops > UINT32_MAX/(sizeof(xFixed) + sizeof(xRenderColor)))
|
||||
return BadLength;
|
||||
if (len != stuff->nStops*(sizeof(xFixed) + sizeof(xRenderColor)))
|
||||
return BadLength;
|
||||
|
||||
|
|
@ -2575,18 +2577,18 @@ SProcRenderCreateSolidFill(ClientPtr client)
|
|||
return (*ProcRenderVector[stuff->renderReqType]) (client);
|
||||
}
|
||||
|
||||
static void swapStops(void *stuff, int n)
|
||||
static void swapStops(void *stuff, int num)
|
||||
{
|
||||
int i;
|
||||
int i, n;
|
||||
CARD32 *stops;
|
||||
CARD16 *colors;
|
||||
stops = (CARD32 *)(stuff);
|
||||
for (i = 0; i < n; ++i) {
|
||||
for (i = 0; i < num; ++i) {
|
||||
swapl(stops, n);
|
||||
++stops;
|
||||
}
|
||||
colors = (CARD16 *)(stops);
|
||||
for (i = 0; i < 4*n; ++i) {
|
||||
for (i = 0; i < 4*num; ++i) {
|
||||
swaps(stops, n);
|
||||
++stops;
|
||||
}
|
||||
|
|
@ -2609,6 +2611,8 @@ SProcRenderCreateLinearGradient (ClientPtr client)
|
|||
swapl(&stuff->nStops, n);
|
||||
|
||||
len = (client->req_len << 2) - sizeof(xRenderCreateLinearGradientReq);
|
||||
if (stuff->nStops > UINT32_MAX/(sizeof(xFixed) + sizeof(xRenderColor)))
|
||||
return BadLength;
|
||||
if (len != stuff->nStops*(sizeof(xFixed) + sizeof(xRenderColor)))
|
||||
return BadLength;
|
||||
|
||||
|
|
@ -2636,6 +2640,8 @@ SProcRenderCreateRadialGradient (ClientPtr client)
|
|||
swapl(&stuff->nStops, n);
|
||||
|
||||
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;
|
||||
|
||||
|
|
@ -2660,6 +2666,8 @@ SProcRenderCreateConicalGradient (ClientPtr client)
|
|||
swapl(&stuff->nStops, n);
|
||||
|
||||
len = (client->req_len << 2) - sizeof(xRenderCreateConicalGradientReq);
|
||||
if (stuff->nStops > UINT32_MAX/(sizeof(xFixed) + sizeof(xRenderColor)))
|
||||
return BadLength;
|
||||
if (len != stuff->nStops*(sizeof(xFixed) + sizeof(xRenderColor)))
|
||||
return BadLength;
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue