glx: fix BindTexImageEXT length check
The request is followed by a list of attributes. X.Org bug#33449 Reported-and-tested-by: meng <mengmeng.meng@intel.com> Signed-off-by: Julien Cristau <jcristau@debian.org> Reviewed-by: Adam Jackson <ajax@redhat.com>
This commit is contained in:
parent
a883cf1545
commit
1137c11be0
|
@ -1697,13 +1697,21 @@ int __glXDisp_BindTexImageEXT(__GLXclientState *cl, GLbyte *pc)
|
||||||
GLXDrawable drawId;
|
GLXDrawable drawId;
|
||||||
int buffer;
|
int buffer;
|
||||||
int error;
|
int error;
|
||||||
|
CARD32 num_attribs;
|
||||||
|
|
||||||
REQUEST_FIXED_SIZE(xGLXVendorPrivateReq, 8);
|
if ((sizeof(xGLXVendorPrivateReq) + 12) >> 2 > client->req_len)
|
||||||
|
return BadLength;
|
||||||
|
|
||||||
pc += __GLX_VENDPRIV_HDR_SIZE;
|
pc += __GLX_VENDPRIV_HDR_SIZE;
|
||||||
|
|
||||||
drawId = *((CARD32 *) (pc));
|
drawId = *((CARD32 *) (pc));
|
||||||
buffer = *((INT32 *) (pc + 4));
|
buffer = *((INT32 *) (pc + 4));
|
||||||
|
num_attribs = *((CARD32 *) (pc + 8));
|
||||||
|
if (num_attribs > (UINT32_MAX >> 3)) {
|
||||||
|
client->errorValue = num_attribs;
|
||||||
|
return BadValue;
|
||||||
|
}
|
||||||
|
REQUEST_FIXED_SIZE(xGLXVendorPrivateReq, 12 + (num_attribs << 3));
|
||||||
|
|
||||||
if (buffer != GLX_FRONT_LEFT_EXT)
|
if (buffer != GLX_FRONT_LEFT_EXT)
|
||||||
return __glXError(GLXBadPixmap);
|
return __glXError(GLXBadPixmap);
|
||||||
|
|
|
@ -648,19 +648,23 @@ int __glXDispSwap_BindTexImageEXT(__GLXclientState *cl, GLbyte *pc)
|
||||||
xGLXVendorPrivateReq *req = (xGLXVendorPrivateReq *) pc;
|
xGLXVendorPrivateReq *req = (xGLXVendorPrivateReq *) pc;
|
||||||
GLXDrawable *drawId;
|
GLXDrawable *drawId;
|
||||||
int *buffer;
|
int *buffer;
|
||||||
|
CARD32 *num_attribs;
|
||||||
__GLX_DECLARE_SWAP_VARIABLES;
|
__GLX_DECLARE_SWAP_VARIABLES;
|
||||||
|
|
||||||
REQUEST_FIXED_SIZE(xGLXVendorPrivateReq, 8);
|
if ((sizeof(xGLXVendorPrivateReq) + 12) >> 2 > client->req_len)
|
||||||
|
return BadLength;
|
||||||
|
|
||||||
pc += __GLX_VENDPRIV_HDR_SIZE;
|
pc += __GLX_VENDPRIV_HDR_SIZE;
|
||||||
|
|
||||||
drawId = ((GLXDrawable *) (pc));
|
drawId = ((GLXDrawable *) (pc));
|
||||||
buffer = ((int *) (pc + 4));
|
buffer = ((int *) (pc + 4));
|
||||||
|
num_attribs = ((CARD32 *) (pc + 8));
|
||||||
|
|
||||||
__GLX_SWAP_SHORT(&req->length);
|
__GLX_SWAP_SHORT(&req->length);
|
||||||
__GLX_SWAP_INT(&req->contextTag);
|
__GLX_SWAP_INT(&req->contextTag);
|
||||||
__GLX_SWAP_INT(drawId);
|
__GLX_SWAP_INT(drawId);
|
||||||
__GLX_SWAP_INT(buffer);
|
__GLX_SWAP_INT(buffer);
|
||||||
|
__GLX_SWAP_INT(num_attribs);
|
||||||
|
|
||||||
return __glXDisp_BindTexImageEXT(cl, (GLbyte *)pc);
|
return __glXDisp_BindTexImageEXT(cl, (GLbyte *)pc);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue