|
|
0fd959 |
From 98fbd6f58553ba0d193a06d2b7b1820ea4483e67 Mon Sep 17 00:00:00 2001
|
|
|
0fd959 |
From: Adam Jackson <ajax@redhat.com>
|
|
|
0fd959 |
Date: Mon, 10 Nov 2014 12:13:47 -0500
|
|
|
0fd959 |
Subject: [PATCH 30/33] glx: Length checking for non-generated single requests
|
|
|
0fd959 |
(v2) [CVE-2014-8098 7/8]
|
|
|
0fd959 |
|
|
|
0fd959 |
v2:
|
|
|
0fd959 |
Fix single versus vendor-private length checking for ARB_imaging subset
|
|
|
0fd959 |
extensions. (Julien Cristau)
|
|
|
0fd959 |
|
|
|
0fd959 |
v3:
|
|
|
0fd959 |
Fix single versus vendor-private length checking for ARB_imaging subset
|
|
|
0fd959 |
extensions. (Julien Cristau)
|
|
|
0fd959 |
|
|
|
0fd959 |
Reviewed-by: Michal Srb <msrb@suse.com>
|
|
|
0fd959 |
Reviewed-by: Andy Ritger <aritger@nvidia.com>
|
|
|
0fd959 |
Signed-off-by: Adam Jackson <ajax@redhat.com>
|
|
|
0fd959 |
Signed-off-by: Julien Cristau <jcristau@debian.org>
|
|
|
0fd959 |
Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
|
|
|
0fd959 |
Signed-off-by: Fedora X Ninjas <x@fedoraproject.org>
|
|
|
0fd959 |
---
|
|
|
0fd959 |
glx/indirect_texture_compression.c | 4 ++++
|
|
|
0fd959 |
glx/single2.c | 23 +++++++++++++++-----
|
|
|
0fd959 |
glx/single2swap.c | 19 ++++++++++++----
|
|
|
0fd959 |
glx/singlepix.c | 44 +++++++++++++++++++++++++-------------
|
|
|
0fd959 |
glx/singlepixswap.c | 34 ++++++++++++++++++++++++-----
|
|
|
0fd959 |
5 files changed, 95 insertions(+), 29 deletions(-)
|
|
|
0fd959 |
|
|
|
0fd959 |
diff --git a/glx/indirect_texture_compression.c b/glx/indirect_texture_compression.c
|
|
|
0fd959 |
index 94de47d..bb640ad 100644
|
|
|
0fd959 |
--- a/glx/indirect_texture_compression.c
|
|
|
0fd959 |
+++ b/glx/indirect_texture_compression.c
|
|
|
0fd959 |
@@ -43,6 +43,8 @@ __glXDisp_GetCompressedTexImage(struct __GLXclientStateRec *cl, GLbyte * pc)
|
|
|
0fd959 |
__GLXcontext *const cx = __glXForceCurrent(cl, req->contextTag, &error);
|
|
|
0fd959 |
ClientPtr client = cl->client;
|
|
|
0fd959 |
|
|
|
0fd959 |
+ REQUEST_FIXED_SIZE(xGLXSingleReq, 8);
|
|
|
0fd959 |
+
|
|
|
0fd959 |
pc += __GLX_SINGLE_HDR_SIZE;
|
|
|
0fd959 |
if (cx != NULL) {
|
|
|
0fd959 |
const GLenum target = *(GLenum *) (pc + 0);
|
|
|
0fd959 |
@@ -85,6 +87,8 @@ __glXDispSwap_GetCompressedTexImage(struct __GLXclientStateRec *cl, GLbyte * pc)
|
|
|
0fd959 |
__glXForceCurrent(cl, bswap_32(req->contextTag), &error);
|
|
|
0fd959 |
ClientPtr client = cl->client;
|
|
|
0fd959 |
|
|
|
0fd959 |
+ REQUEST_FIXED_SIZE(xGLXSingleReq, 8);
|
|
|
0fd959 |
+
|
|
|
0fd959 |
pc += __GLX_SINGLE_HDR_SIZE;
|
|
|
0fd959 |
if (cx != NULL) {
|
|
|
0fd959 |
const GLenum target = (GLenum) bswap_32(*(int *) (pc + 0));
|
|
|
0fd959 |
diff --git a/glx/single2.c b/glx/single2.c
|
|
|
0fd959 |
index 53b661d..a6ea614 100644
|
|
|
0fd959 |
--- a/glx/single2.c
|
|
|
0fd959 |
+++ b/glx/single2.c
|
|
|
0fd959 |
@@ -45,11 +45,14 @@
|
|
|
0fd959 |
int
|
|
|
0fd959 |
__glXDisp_FeedbackBuffer(__GLXclientState * cl, GLbyte * pc)
|
|
|
0fd959 |
{
|
|
|
0fd959 |
+ ClientPtr client = cl->client;
|
|
|
0fd959 |
GLsizei size;
|
|
|
0fd959 |
GLenum type;
|
|
|
0fd959 |
__GLXcontext *cx;
|
|
|
0fd959 |
int error;
|
|
|
0fd959 |
|
|
|
0fd959 |
+ REQUEST_FIXED_SIZE(xGLXSingleReq, 8);
|
|
|
0fd959 |
+
|
|
|
0fd959 |
cx = __glXForceCurrent(cl, __GLX_GET_SINGLE_CONTEXT_TAG(pc), &error);
|
|
|
0fd959 |
if (!cx) {
|
|
|
0fd959 |
return error;
|
|
|
0fd959 |
@@ -76,10 +79,13 @@ __glXDisp_FeedbackBuffer(__GLXclientState * cl, GLbyte * pc)
|
|
|
0fd959 |
int
|
|
|
0fd959 |
__glXDisp_SelectBuffer(__GLXclientState * cl, GLbyte * pc)
|
|
|
0fd959 |
{
|
|
|
0fd959 |
+ ClientPtr client = cl->client;
|
|
|
0fd959 |
__GLXcontext *cx;
|
|
|
0fd959 |
GLsizei size;
|
|
|
0fd959 |
int error;
|
|
|
0fd959 |
|
|
|
0fd959 |
+ REQUEST_FIXED_SIZE(xGLXSingleReq, 4);
|
|
|
0fd959 |
+
|
|
|
0fd959 |
cx = __glXForceCurrent(cl, __GLX_GET_SINGLE_CONTEXT_TAG(pc), &error);
|
|
|
0fd959 |
if (!cx) {
|
|
|
0fd959 |
return error;
|
|
|
0fd959 |
@@ -104,7 +110,7 @@ __glXDisp_SelectBuffer(__GLXclientState * cl, GLbyte * pc)
|
|
|
0fd959 |
int
|
|
|
0fd959 |
__glXDisp_RenderMode(__GLXclientState * cl, GLbyte * pc)
|
|
|
0fd959 |
{
|
|
|
0fd959 |
- ClientPtr client;
|
|
|
0fd959 |
+ ClientPtr client = cl->client;
|
|
|
0fd959 |
xGLXRenderModeReply reply;
|
|
|
0fd959 |
__GLXcontext *cx;
|
|
|
0fd959 |
GLint nitems = 0, retBytes = 0, retval, newModeCheck;
|
|
|
0fd959 |
@@ -112,6 +118,8 @@ __glXDisp_RenderMode(__GLXclientState * cl, GLbyte * pc)
|
|
|
0fd959 |
GLenum newMode;
|
|
|
0fd959 |
int error;
|
|
|
0fd959 |
|
|
|
0fd959 |
+ REQUEST_FIXED_SIZE(xGLXSingleReq, 4);
|
|
|
0fd959 |
+
|
|
|
0fd959 |
cx = __glXForceCurrent(cl, __GLX_GET_SINGLE_CONTEXT_TAG(pc), &error);
|
|
|
0fd959 |
if (!cx) {
|
|
|
0fd959 |
return error;
|
|
|
0fd959 |
@@ -188,7 +196,6 @@ __glXDisp_RenderMode(__GLXclientState * cl, GLbyte * pc)
|
|
|
0fd959 |
** selection array, as per the API for glRenderMode itself.
|
|
|
0fd959 |
*/
|
|
|
0fd959 |
noChangeAllowed:;
|
|
|
0fd959 |
- client = cl->client;
|
|
|
0fd959 |
reply = (xGLXRenderModeReply) {
|
|
|
0fd959 |
.type = X_Reply,
|
|
|
0fd959 |
.sequenceNumber = client->sequence,
|
|
|
0fd959 |
@@ -207,9 +214,12 @@ __glXDisp_RenderMode(__GLXclientState * cl, GLbyte * pc)
|
|
|
0fd959 |
int
|
|
|
0fd959 |
__glXDisp_Flush(__GLXclientState * cl, GLbyte * pc)
|
|
|
0fd959 |
{
|
|
|
0fd959 |
+ ClientPtr client = cl->client;
|
|
|
0fd959 |
__GLXcontext *cx;
|
|
|
0fd959 |
int error;
|
|
|
0fd959 |
|
|
|
0fd959 |
+ REQUEST_SIZE_MATCH(xGLXSingleReq);
|
|
|
0fd959 |
+
|
|
|
0fd959 |
cx = __glXForceCurrent(cl, __GLX_GET_SINGLE_CONTEXT_TAG(pc), &error);
|
|
|
0fd959 |
if (!cx) {
|
|
|
0fd959 |
return error;
|
|
|
0fd959 |
@@ -223,10 +233,12 @@ __glXDisp_Flush(__GLXclientState * cl, GLbyte * pc)
|
|
|
0fd959 |
int
|
|
|
0fd959 |
__glXDisp_Finish(__GLXclientState * cl, GLbyte * pc)
|
|
|
0fd959 |
{
|
|
|
0fd959 |
+ ClientPtr client = cl->client;
|
|
|
0fd959 |
__GLXcontext *cx;
|
|
|
0fd959 |
- ClientPtr client;
|
|
|
0fd959 |
int error;
|
|
|
0fd959 |
|
|
|
0fd959 |
+ REQUEST_SIZE_MATCH(xGLXSingleReq);
|
|
|
0fd959 |
+
|
|
|
0fd959 |
cx = __glXForceCurrent(cl, __GLX_GET_SINGLE_CONTEXT_TAG(pc), &error);
|
|
|
0fd959 |
if (!cx) {
|
|
|
0fd959 |
return error;
|
|
|
0fd959 |
@@ -317,7 +329,7 @@ __glXcombine_strings(const char *cext_string, const char *sext_string)
|
|
|
0fd959 |
int
|
|
|
0fd959 |
DoGetString(__GLXclientState * cl, GLbyte * pc, GLboolean need_swap)
|
|
|
0fd959 |
{
|
|
|
0fd959 |
- ClientPtr client;
|
|
|
0fd959 |
+ ClientPtr client = cl->client;
|
|
|
0fd959 |
__GLXcontext *cx;
|
|
|
0fd959 |
GLenum name;
|
|
|
0fd959 |
const char *string;
|
|
|
0fd959 |
@@ -327,6 +339,8 @@ DoGetString(__GLXclientState * cl, GLbyte * pc, GLboolean need_swap)
|
|
|
0fd959 |
char *buf = NULL, *buf1 = NULL;
|
|
|
0fd959 |
GLint length = 0;
|
|
|
0fd959 |
|
|
|
0fd959 |
+ REQUEST_FIXED_SIZE(xGLXSingleReq, 4);
|
|
|
0fd959 |
+
|
|
|
0fd959 |
/* If the client has the opposite byte order, swap the contextTag and
|
|
|
0fd959 |
* the name.
|
|
|
0fd959 |
*/
|
|
|
0fd959 |
@@ -343,7 +357,6 @@ DoGetString(__GLXclientState * cl, GLbyte * pc, GLboolean need_swap)
|
|
|
0fd959 |
pc += __GLX_SINGLE_HDR_SIZE;
|
|
|
0fd959 |
name = *(GLenum *) (pc + 0);
|
|
|
0fd959 |
string = (const char *) glGetString(name);
|
|
|
0fd959 |
- client = cl->client;
|
|
|
0fd959 |
|
|
|
0fd959 |
if (string == NULL)
|
|
|
0fd959 |
string = "";
|
|
|
0fd959 |
diff --git a/glx/single2swap.c b/glx/single2swap.c
|
|
|
0fd959 |
index 764501f..5349069 100644
|
|
|
0fd959 |
--- a/glx/single2swap.c
|
|
|
0fd959 |
+++ b/glx/single2swap.c
|
|
|
0fd959 |
@@ -41,6 +41,7 @@
|
|
|
0fd959 |
int
|
|
|
0fd959 |
__glXDispSwap_FeedbackBuffer(__GLXclientState * cl, GLbyte * pc)
|
|
|
0fd959 |
{
|
|
|
0fd959 |
+ ClientPtr client = cl->client;
|
|
|
0fd959 |
GLsizei size;
|
|
|
0fd959 |
GLenum type;
|
|
|
0fd959 |
|
|
|
0fd959 |
@@ -48,6 +49,8 @@ __glXDispSwap_FeedbackBuffer(__GLXclientState * cl, GLbyte * pc)
|
|
|
0fd959 |
__GLXcontext *cx;
|
|
|
0fd959 |
int error;
|
|
|
0fd959 |
|
|
|
0fd959 |
+ REQUEST_FIXED_SIZE(xGLXSingleReq, 8);
|
|
|
0fd959 |
+
|
|
|
0fd959 |
__GLX_SWAP_INT(&((xGLXSingleReq *) pc)->contextTag);
|
|
|
0fd959 |
cx = __glXForceCurrent(cl, __GLX_GET_SINGLE_CONTEXT_TAG(pc), &error);
|
|
|
0fd959 |
if (!cx) {
|
|
|
0fd959 |
@@ -77,12 +80,15 @@ __glXDispSwap_FeedbackBuffer(__GLXclientState * cl, GLbyte * pc)
|
|
|
0fd959 |
int
|
|
|
0fd959 |
__glXDispSwap_SelectBuffer(__GLXclientState * cl, GLbyte * pc)
|
|
|
0fd959 |
{
|
|
|
0fd959 |
+ ClientPtr client = cl->client;
|
|
|
0fd959 |
__GLXcontext *cx;
|
|
|
0fd959 |
GLsizei size;
|
|
|
0fd959 |
|
|
|
0fd959 |
__GLX_DECLARE_SWAP_VARIABLES;
|
|
|
0fd959 |
int error;
|
|
|
0fd959 |
|
|
|
0fd959 |
+ REQUEST_FIXED_SIZE(xGLXSingleReq, 4);
|
|
|
0fd959 |
+
|
|
|
0fd959 |
__GLX_SWAP_INT(&((xGLXSingleReq *) pc)->contextTag);
|
|
|
0fd959 |
cx = __glXForceCurrent(cl, __GLX_GET_SINGLE_CONTEXT_TAG(pc), &error);
|
|
|
0fd959 |
if (!cx) {
|
|
|
0fd959 |
@@ -109,7 +115,7 @@ __glXDispSwap_SelectBuffer(__GLXclientState * cl, GLbyte * pc)
|
|
|
0fd959 |
int
|
|
|
0fd959 |
__glXDispSwap_RenderMode(__GLXclientState * cl, GLbyte * pc)
|
|
|
0fd959 |
{
|
|
|
0fd959 |
- ClientPtr client;
|
|
|
0fd959 |
+ ClientPtr client = cl->client;
|
|
|
0fd959 |
__GLXcontext *cx;
|
|
|
0fd959 |
xGLXRenderModeReply reply;
|
|
|
0fd959 |
GLint nitems = 0, retBytes = 0, retval, newModeCheck;
|
|
|
0fd959 |
@@ -120,6 +126,8 @@ __glXDispSwap_RenderMode(__GLXclientState * cl, GLbyte * pc)
|
|
|
0fd959 |
__GLX_DECLARE_SWAP_ARRAY_VARIABLES;
|
|
|
0fd959 |
int error;
|
|
|
0fd959 |
|
|
|
0fd959 |
+ REQUEST_FIXED_SIZE(xGLXSingleReq, 4);
|
|
|
0fd959 |
+
|
|
|
0fd959 |
__GLX_SWAP_INT(&((xGLXSingleReq *) pc)->contextTag);
|
|
|
0fd959 |
cx = __glXForceCurrent(cl, __GLX_GET_SINGLE_CONTEXT_TAG(pc), &error);
|
|
|
0fd959 |
if (!cx) {
|
|
|
0fd959 |
@@ -200,7 +208,6 @@ __glXDispSwap_RenderMode(__GLXclientState * cl, GLbyte * pc)
|
|
|
0fd959 |
** selection array, as per the API for glRenderMode itself.
|
|
|
0fd959 |
*/
|
|
|
0fd959 |
noChangeAllowed:;
|
|
|
0fd959 |
- client = cl->client;
|
|
|
0fd959 |
reply = (xGLXRenderModeReply) {
|
|
|
0fd959 |
.type = X_Reply,
|
|
|
0fd959 |
.sequenceNumber = client->sequence,
|
|
|
0fd959 |
@@ -224,11 +231,14 @@ __glXDispSwap_RenderMode(__GLXclientState * cl, GLbyte * pc)
|
|
|
0fd959 |
int
|
|
|
0fd959 |
__glXDispSwap_Flush(__GLXclientState * cl, GLbyte * pc)
|
|
|
0fd959 |
{
|
|
|
0fd959 |
+ ClientPtr client = cl->client;
|
|
|
0fd959 |
__GLXcontext *cx;
|
|
|
0fd959 |
int error;
|
|
|
0fd959 |
|
|
|
0fd959 |
__GLX_DECLARE_SWAP_VARIABLES;
|
|
|
0fd959 |
|
|
|
0fd959 |
+ REQUEST_SIZE_MATCH(xGLXSingleReq);
|
|
|
0fd959 |
+
|
|
|
0fd959 |
__GLX_SWAP_INT(&((xGLXSingleReq *) pc)->contextTag);
|
|
|
0fd959 |
cx = __glXForceCurrent(cl, __GLX_GET_SINGLE_CONTEXT_TAG(pc), &error);
|
|
|
0fd959 |
if (!cx) {
|
|
|
0fd959 |
@@ -243,12 +253,14 @@ __glXDispSwap_Flush(__GLXclientState * cl, GLbyte * pc)
|
|
|
0fd959 |
int
|
|
|
0fd959 |
__glXDispSwap_Finish(__GLXclientState * cl, GLbyte * pc)
|
|
|
0fd959 |
{
|
|
|
0fd959 |
+ ClientPtr client = cl->client;
|
|
|
0fd959 |
__GLXcontext *cx;
|
|
|
0fd959 |
- ClientPtr client;
|
|
|
0fd959 |
int error;
|
|
|
0fd959 |
|
|
|
0fd959 |
__GLX_DECLARE_SWAP_VARIABLES;
|
|
|
0fd959 |
|
|
|
0fd959 |
+ REQUEST_SIZE_MATCH(xGLXSingleReq);
|
|
|
0fd959 |
+
|
|
|
0fd959 |
__GLX_SWAP_INT(&((xGLXSingleReq *) pc)->contextTag);
|
|
|
0fd959 |
cx = __glXForceCurrent(cl, __GLX_GET_SINGLE_CONTEXT_TAG(pc), &error);
|
|
|
0fd959 |
if (!cx) {
|
|
|
0fd959 |
@@ -260,7 +272,6 @@ __glXDispSwap_Finish(__GLXclientState * cl, GLbyte * pc)
|
|
|
0fd959 |
cx->hasUnflushedCommands = GL_FALSE;
|
|
|
0fd959 |
|
|
|
0fd959 |
/* Send empty reply packet to indicate finish is finished */
|
|
|
0fd959 |
- client = cl->client;
|
|
|
0fd959 |
__GLX_BEGIN_REPLY(0);
|
|
|
0fd959 |
__GLX_PUT_RETVAL(0);
|
|
|
0fd959 |
__GLX_SWAP_REPLY_HEADER();
|
|
|
0fd959 |
diff --git a/glx/singlepix.c b/glx/singlepix.c
|
|
|
0fd959 |
index 8b6c261..54ed7fd 100644
|
|
|
0fd959 |
--- a/glx/singlepix.c
|
|
|
0fd959 |
+++ b/glx/singlepix.c
|
|
|
0fd959 |
@@ -51,6 +51,8 @@ __glXDisp_ReadPixels(__GLXclientState * cl, GLbyte * pc)
|
|
|
0fd959 |
int error;
|
|
|
0fd959 |
char *answer, answerBuffer[200];
|
|
|
0fd959 |
|
|
|
0fd959 |
+ REQUEST_FIXED_SIZE(xGLXSingleReq, 28);
|
|
|
0fd959 |
+
|
|
|
0fd959 |
cx = __glXForceCurrent(cl, __GLX_GET_SINGLE_CONTEXT_TAG(pc), &error);
|
|
|
0fd959 |
if (!cx) {
|
|
|
0fd959 |
return error;
|
|
|
0fd959 |
@@ -100,6 +102,8 @@ __glXDisp_GetTexImage(__GLXclientState * cl, GLbyte * pc)
|
|
|
0fd959 |
char *answer, answerBuffer[200];
|
|
|
0fd959 |
GLint width = 0, height = 0, depth = 1;
|
|
|
0fd959 |
|
|
|
0fd959 |
+ REQUEST_FIXED_SIZE(xGLXSingleReq, 20);
|
|
|
0fd959 |
+
|
|
|
0fd959 |
cx = __glXForceCurrent(cl, __GLX_GET_SINGLE_CONTEXT_TAG(pc), &error);
|
|
|
0fd959 |
if (!cx) {
|
|
|
0fd959 |
return error;
|
|
|
0fd959 |
@@ -157,6 +161,8 @@ __glXDisp_GetPolygonStipple(__GLXclientState * cl, GLbyte * pc)
|
|
|
0fd959 |
GLubyte answerBuffer[200];
|
|
|
0fd959 |
char *answer;
|
|
|
0fd959 |
|
|
|
0fd959 |
+ REQUEST_FIXED_SIZE(xGLXSingleReq, 4);
|
|
|
0fd959 |
+
|
|
|
0fd959 |
cx = __glXForceCurrent(cl, __GLX_GET_SINGLE_CONTEXT_TAG(pc), &error);
|
|
|
0fd959 |
if (!cx) {
|
|
|
0fd959 |
return error;
|
|
|
0fd959 |
@@ -217,15 +223,13 @@ GetSeparableFilter(__GLXclientState * cl, GLbyte * pc, GLXContextTag tag)
|
|
|
0fd959 |
compsize = __glGetTexImage_size(target, 1, format, type, width, 1, 1);
|
|
|
0fd959 |
compsize2 = __glGetTexImage_size(target, 1, format, type, height, 1, 1);
|
|
|
0fd959 |
|
|
|
0fd959 |
- if (compsize < 0)
|
|
|
0fd959 |
+ if ((compsize = safe_pad(compsize)) < 0)
|
|
|
0fd959 |
return BadLength;
|
|
|
0fd959 |
- if (compsize2 < 0)
|
|
|
0fd959 |
+ if ((compsize2 = safe_pad(compsize2)) < 0)
|
|
|
0fd959 |
return BadLength;
|
|
|
0fd959 |
- compsize = __GLX_PAD(compsize);
|
|
|
0fd959 |
- compsize2 = __GLX_PAD(compsize2);
|
|
|
0fd959 |
|
|
|
0fd959 |
glPixelStorei(GL_PACK_SWAP_BYTES, swapBytes);
|
|
|
0fd959 |
- __GLX_GET_ANSWER_BUFFER(answer, cl, compsize + compsize2, 1);
|
|
|
0fd959 |
+ __GLX_GET_ANSWER_BUFFER(answer, cl, safe_add(compsize, compsize2), 1);
|
|
|
0fd959 |
__glXClearErrorOccured();
|
|
|
0fd959 |
glGetSeparableFilter(*(GLenum *) (pc + 0), *(GLenum *) (pc + 4),
|
|
|
0fd959 |
*(GLenum *) (pc + 8), answer, answer + compsize, NULL);
|
|
|
0fd959 |
@@ -249,7 +253,8 @@ int
|
|
|
0fd959 |
__glXDisp_GetSeparableFilter(__GLXclientState * cl, GLbyte * pc)
|
|
|
0fd959 |
{
|
|
|
0fd959 |
const GLXContextTag tag = __GLX_GET_SINGLE_CONTEXT_TAG(pc);
|
|
|
0fd959 |
-
|
|
|
0fd959 |
+ ClientPtr client = cl->client;
|
|
|
0fd959 |
+ REQUEST_FIXED_SIZE(xGLXSingleReq, 16);
|
|
|
0fd959 |
return GetSeparableFilter(cl, pc + __GLX_SINGLE_HDR_SIZE, tag);
|
|
|
0fd959 |
}
|
|
|
0fd959 |
|
|
|
0fd959 |
@@ -257,7 +262,8 @@ int
|
|
|
0fd959 |
__glXDisp_GetSeparableFilterEXT(__GLXclientState * cl, GLbyte * pc)
|
|
|
0fd959 |
{
|
|
|
0fd959 |
const GLXContextTag tag = __GLX_GET_VENDPRIV_CONTEXT_TAG(pc);
|
|
|
0fd959 |
-
|
|
|
0fd959 |
+ ClientPtr client = cl->client;
|
|
|
0fd959 |
+ REQUEST_FIXED_SIZE(xGLXVendorPrivateReq, 16);
|
|
|
0fd959 |
return GetSeparableFilter(cl, pc + __GLX_VENDPRIV_HDR_SIZE, tag);
|
|
|
0fd959 |
}
|
|
|
0fd959 |
|
|
|
0fd959 |
@@ -323,7 +329,8 @@ int
|
|
|
0fd959 |
__glXDisp_GetConvolutionFilter(__GLXclientState * cl, GLbyte * pc)
|
|
|
0fd959 |
{
|
|
|
0fd959 |
const GLXContextTag tag = __GLX_GET_SINGLE_CONTEXT_TAG(pc);
|
|
|
0fd959 |
-
|
|
|
0fd959 |
+ ClientPtr client = cl->client;
|
|
|
0fd959 |
+ REQUEST_FIXED_SIZE(xGLXSingleReq, 16);
|
|
|
0fd959 |
return GetConvolutionFilter(cl, pc + __GLX_SINGLE_HDR_SIZE, tag);
|
|
|
0fd959 |
}
|
|
|
0fd959 |
|
|
|
0fd959 |
@@ -331,7 +338,8 @@ int
|
|
|
0fd959 |
__glXDisp_GetConvolutionFilterEXT(__GLXclientState * cl, GLbyte * pc)
|
|
|
0fd959 |
{
|
|
|
0fd959 |
const GLXContextTag tag = __GLX_GET_VENDPRIV_CONTEXT_TAG(pc);
|
|
|
0fd959 |
-
|
|
|
0fd959 |
+ ClientPtr client = cl->client;
|
|
|
0fd959 |
+ REQUEST_FIXED_SIZE(xGLXVendorPrivateReq, 16);
|
|
|
0fd959 |
return GetConvolutionFilter(cl, pc + __GLX_VENDPRIV_HDR_SIZE, tag);
|
|
|
0fd959 |
}
|
|
|
0fd959 |
|
|
|
0fd959 |
@@ -390,7 +398,8 @@ int
|
|
|
0fd959 |
__glXDisp_GetHistogram(__GLXclientState * cl, GLbyte * pc)
|
|
|
0fd959 |
{
|
|
|
0fd959 |
const GLXContextTag tag = __GLX_GET_SINGLE_CONTEXT_TAG(pc);
|
|
|
0fd959 |
-
|
|
|
0fd959 |
+ ClientPtr client = cl->client;
|
|
|
0fd959 |
+ REQUEST_FIXED_SIZE(xGLXSingleReq, 16);
|
|
|
0fd959 |
return GetHistogram(cl, pc + __GLX_SINGLE_HDR_SIZE, tag);
|
|
|
0fd959 |
}
|
|
|
0fd959 |
|
|
|
0fd959 |
@@ -398,7 +407,8 @@ int
|
|
|
0fd959 |
__glXDisp_GetHistogramEXT(__GLXclientState * cl, GLbyte * pc)
|
|
|
0fd959 |
{
|
|
|
0fd959 |
const GLXContextTag tag = __GLX_GET_VENDPRIV_CONTEXT_TAG(pc);
|
|
|
0fd959 |
-
|
|
|
0fd959 |
+ ClientPtr client = cl->client;
|
|
|
0fd959 |
+ REQUEST_FIXED_SIZE(xGLXVendorPrivateReq, 16);
|
|
|
0fd959 |
return GetHistogram(cl, pc + __GLX_VENDPRIV_HDR_SIZE, tag);
|
|
|
0fd959 |
}
|
|
|
0fd959 |
|
|
|
0fd959 |
@@ -450,7 +460,8 @@ int
|
|
|
0fd959 |
__glXDisp_GetMinmax(__GLXclientState * cl, GLbyte * pc)
|
|
|
0fd959 |
{
|
|
|
0fd959 |
const GLXContextTag tag = __GLX_GET_SINGLE_CONTEXT_TAG(pc);
|
|
|
0fd959 |
-
|
|
|
0fd959 |
+ ClientPtr client = cl->client;
|
|
|
0fd959 |
+ REQUEST_FIXED_SIZE(xGLXSingleReq, 16);
|
|
|
0fd959 |
return GetMinmax(cl, pc + __GLX_SINGLE_HDR_SIZE, tag);
|
|
|
0fd959 |
}
|
|
|
0fd959 |
|
|
|
0fd959 |
@@ -458,7 +469,8 @@ int
|
|
|
0fd959 |
__glXDisp_GetMinmaxEXT(__GLXclientState * cl, GLbyte * pc)
|
|
|
0fd959 |
{
|
|
|
0fd959 |
const GLXContextTag tag = __GLX_GET_VENDPRIV_CONTEXT_TAG(pc);
|
|
|
0fd959 |
-
|
|
|
0fd959 |
+ ClientPtr client = cl->client;
|
|
|
0fd959 |
+ REQUEST_FIXED_SIZE(xGLXVendorPrivateReq, 16);
|
|
|
0fd959 |
return GetMinmax(cl, pc + __GLX_VENDPRIV_HDR_SIZE, tag);
|
|
|
0fd959 |
}
|
|
|
0fd959 |
|
|
|
0fd959 |
@@ -517,7 +529,8 @@ int
|
|
|
0fd959 |
__glXDisp_GetColorTable(__GLXclientState * cl, GLbyte * pc)
|
|
|
0fd959 |
{
|
|
|
0fd959 |
const GLXContextTag tag = __GLX_GET_SINGLE_CONTEXT_TAG(pc);
|
|
|
0fd959 |
-
|
|
|
0fd959 |
+ ClientPtr client = cl->client;
|
|
|
0fd959 |
+ REQUEST_FIXED_SIZE(xGLXSingleReq, 16);
|
|
|
0fd959 |
return GetColorTable(cl, pc + __GLX_SINGLE_HDR_SIZE, tag);
|
|
|
0fd959 |
}
|
|
|
0fd959 |
|
|
|
0fd959 |
@@ -525,6 +538,7 @@ int
|
|
|
0fd959 |
__glXDisp_GetColorTableSGI(__GLXclientState * cl, GLbyte * pc)
|
|
|
0fd959 |
{
|
|
|
0fd959 |
const GLXContextTag tag = __GLX_GET_VENDPRIV_CONTEXT_TAG(pc);
|
|
|
0fd959 |
-
|
|
|
0fd959 |
+ ClientPtr client = cl->client;
|
|
|
0fd959 |
+ REQUEST_FIXED_SIZE(xGLXVendorPrivateReq, 16);
|
|
|
0fd959 |
return GetColorTable(cl, pc + __GLX_VENDPRIV_HDR_SIZE, tag);
|
|
|
0fd959 |
}
|
|
|
0fd959 |
diff --git a/glx/singlepixswap.c b/glx/singlepixswap.c
|
|
|
0fd959 |
index 8dc304f..9eff592 100644
|
|
|
0fd959 |
--- a/glx/singlepixswap.c
|
|
|
0fd959 |
+++ b/glx/singlepixswap.c
|
|
|
0fd959 |
@@ -53,6 +53,8 @@ __glXDispSwap_ReadPixels(__GLXclientState * cl, GLbyte * pc)
|
|
|
0fd959 |
int error;
|
|
|
0fd959 |
char *answer, answerBuffer[200];
|
|
|
0fd959 |
|
|
|
0fd959 |
+ REQUEST_FIXED_SIZE(xGLXSingleReq, 28);
|
|
|
0fd959 |
+
|
|
|
0fd959 |
__GLX_SWAP_INT(&((xGLXSingleReq *) pc)->contextTag);
|
|
|
0fd959 |
cx = __glXForceCurrent(cl, __GLX_GET_SINGLE_CONTEXT_TAG(pc), &error);
|
|
|
0fd959 |
if (!cx) {
|
|
|
0fd959 |
@@ -114,6 +116,8 @@ __glXDispSwap_GetTexImage(__GLXclientState * cl, GLbyte * pc)
|
|
|
0fd959 |
char *answer, answerBuffer[200];
|
|
|
0fd959 |
GLint width = 0, height = 0, depth = 1;
|
|
|
0fd959 |
|
|
|
0fd959 |
+ REQUEST_FIXED_SIZE(xGLXSingleReq, 20);
|
|
|
0fd959 |
+
|
|
|
0fd959 |
__GLX_SWAP_INT(&((xGLXSingleReq *) pc)->contextTag);
|
|
|
0fd959 |
cx = __glXForceCurrent(cl, __GLX_GET_SINGLE_CONTEXT_TAG(pc), &error);
|
|
|
0fd959 |
if (!cx) {
|
|
|
0fd959 |
@@ -184,6 +188,8 @@ __glXDispSwap_GetPolygonStipple(__GLXclientState * cl, GLbyte * pc)
|
|
|
0fd959 |
|
|
|
0fd959 |
__GLX_DECLARE_SWAP_VARIABLES;
|
|
|
0fd959 |
|
|
|
0fd959 |
+ REQUEST_FIXED_SIZE(xGLXSingleReq, 4);
|
|
|
0fd959 |
+
|
|
|
0fd959 |
__GLX_SWAP_INT(&((xGLXSingleReq *) pc)->contextTag);
|
|
|
0fd959 |
cx = __glXForceCurrent(cl, __GLX_GET_SINGLE_CONTEXT_TAG(pc), &error);
|
|
|
0fd959 |
if (!cx) {
|
|
|
0fd959 |
@@ -251,15 +257,13 @@ GetSeparableFilter(__GLXclientState * cl, GLbyte * pc, GLXContextTag tag)
|
|
|
0fd959 |
compsize = __glGetTexImage_size(target, 1, format, type, width, 1, 1);
|
|
|
0fd959 |
compsize2 = __glGetTexImage_size(target, 1, format, type, height, 1, 1);
|
|
|
0fd959 |
|
|
|
0fd959 |
- if (compsize < 0)
|
|
|
0fd959 |
+ if ((compsize = safe_pad(compsize)) < 0)
|
|
|
0fd959 |
return BadLength;
|
|
|
0fd959 |
- if (compsize2 < 0)
|
|
|
0fd959 |
+ if ((compsize2 = safe_pad(compsize2)) < 0)
|
|
|
0fd959 |
return BadLength;
|
|
|
0fd959 |
- compsize = __GLX_PAD(compsize);
|
|
|
0fd959 |
- compsize2 = __GLX_PAD(compsize2);
|
|
|
0fd959 |
|
|
|
0fd959 |
glPixelStorei(GL_PACK_SWAP_BYTES, !swapBytes);
|
|
|
0fd959 |
- __GLX_GET_ANSWER_BUFFER(answer, cl, compsize + compsize2, 1);
|
|
|
0fd959 |
+ __GLX_GET_ANSWER_BUFFER(answer, cl, safe_add(compsize, compsize2), 1);
|
|
|
0fd959 |
__glXClearErrorOccured();
|
|
|
0fd959 |
glGetSeparableFilter(*(GLenum *) (pc + 0), *(GLenum *) (pc + 4),
|
|
|
0fd959 |
*(GLenum *) (pc + 8), answer, answer + compsize, NULL);
|
|
|
0fd959 |
@@ -285,7 +289,9 @@ int
|
|
|
0fd959 |
__glXDispSwap_GetSeparableFilter(__GLXclientState * cl, GLbyte * pc)
|
|
|
0fd959 |
{
|
|
|
0fd959 |
const GLXContextTag tag = __GLX_GET_SINGLE_CONTEXT_TAG(pc);
|
|
|
0fd959 |
+ ClientPtr client = cl->client;
|
|
|
0fd959 |
|
|
|
0fd959 |
+ REQUEST_FIXED_SIZE(xGLXSingleReq, 16);
|
|
|
0fd959 |
return GetSeparableFilter(cl, pc + __GLX_SINGLE_HDR_SIZE, tag);
|
|
|
0fd959 |
}
|
|
|
0fd959 |
|
|
|
0fd959 |
@@ -293,7 +299,9 @@ int
|
|
|
0fd959 |
__glXDispSwap_GetSeparableFilterEXT(__GLXclientState * cl, GLbyte * pc)
|
|
|
0fd959 |
{
|
|
|
0fd959 |
const GLXContextTag tag = __GLX_GET_VENDPRIV_CONTEXT_TAG(pc);
|
|
|
0fd959 |
+ ClientPtr client = cl->client;
|
|
|
0fd959 |
|
|
|
0fd959 |
+ REQUEST_FIXED_SIZE(xGLXVendorPrivateReq, 16);
|
|
|
0fd959 |
return GetSeparableFilter(cl, pc + __GLX_VENDPRIV_HDR_SIZE, tag);
|
|
|
0fd959 |
}
|
|
|
0fd959 |
|
|
|
0fd959 |
@@ -367,7 +375,9 @@ int
|
|
|
0fd959 |
__glXDispSwap_GetConvolutionFilter(__GLXclientState * cl, GLbyte * pc)
|
|
|
0fd959 |
{
|
|
|
0fd959 |
const GLXContextTag tag = __GLX_GET_SINGLE_CONTEXT_TAG(pc);
|
|
|
0fd959 |
+ ClientPtr client = cl->client;
|
|
|
0fd959 |
|
|
|
0fd959 |
+ REQUEST_FIXED_SIZE(xGLXSingleReq, 16);
|
|
|
0fd959 |
return GetConvolutionFilter(cl, pc + __GLX_SINGLE_HDR_SIZE, tag);
|
|
|
0fd959 |
}
|
|
|
0fd959 |
|
|
|
0fd959 |
@@ -375,7 +385,9 @@ int
|
|
|
0fd959 |
__glXDispSwap_GetConvolutionFilterEXT(__GLXclientState * cl, GLbyte * pc)
|
|
|
0fd959 |
{
|
|
|
0fd959 |
const GLXContextTag tag = __GLX_GET_VENDPRIV_CONTEXT_TAG(pc);
|
|
|
0fd959 |
+ ClientPtr client = cl->client;
|
|
|
0fd959 |
|
|
|
0fd959 |
+ REQUEST_FIXED_SIZE(xGLXVendorPrivateReq, 16);
|
|
|
0fd959 |
return GetConvolutionFilter(cl, pc + __GLX_VENDPRIV_HDR_SIZE, tag);
|
|
|
0fd959 |
}
|
|
|
0fd959 |
|
|
|
0fd959 |
@@ -441,7 +453,9 @@ int
|
|
|
0fd959 |
__glXDispSwap_GetHistogram(__GLXclientState * cl, GLbyte * pc)
|
|
|
0fd959 |
{
|
|
|
0fd959 |
const GLXContextTag tag = __GLX_GET_SINGLE_CONTEXT_TAG(pc);
|
|
|
0fd959 |
+ ClientPtr client = cl->client;
|
|
|
0fd959 |
|
|
|
0fd959 |
+ REQUEST_FIXED_SIZE(xGLXSingleReq, 16);
|
|
|
0fd959 |
return GetHistogram(cl, pc + __GLX_SINGLE_HDR_SIZE, tag);
|
|
|
0fd959 |
}
|
|
|
0fd959 |
|
|
|
0fd959 |
@@ -449,7 +463,9 @@ int
|
|
|
0fd959 |
__glXDispSwap_GetHistogramEXT(__GLXclientState * cl, GLbyte * pc)
|
|
|
0fd959 |
{
|
|
|
0fd959 |
const GLXContextTag tag = __GLX_GET_VENDPRIV_CONTEXT_TAG(pc);
|
|
|
0fd959 |
+ ClientPtr client = cl->client;
|
|
|
0fd959 |
|
|
|
0fd959 |
+ REQUEST_FIXED_SIZE(xGLXVendorPrivateReq, 16);
|
|
|
0fd959 |
return GetHistogram(cl, pc + __GLX_VENDPRIV_HDR_SIZE, tag);
|
|
|
0fd959 |
}
|
|
|
0fd959 |
|
|
|
0fd959 |
@@ -507,7 +523,9 @@ int
|
|
|
0fd959 |
__glXDispSwap_GetMinmax(__GLXclientState * cl, GLbyte * pc)
|
|
|
0fd959 |
{
|
|
|
0fd959 |
const GLXContextTag tag = __GLX_GET_SINGLE_CONTEXT_TAG(pc);
|
|
|
0fd959 |
+ ClientPtr client = cl->client;
|
|
|
0fd959 |
|
|
|
0fd959 |
+ REQUEST_FIXED_SIZE(xGLXSingleReq, 16);
|
|
|
0fd959 |
return GetMinmax(cl, pc + __GLX_SINGLE_HDR_SIZE, tag);
|
|
|
0fd959 |
}
|
|
|
0fd959 |
|
|
|
0fd959 |
@@ -515,7 +533,9 @@ int
|
|
|
0fd959 |
__glXDispSwap_GetMinmaxEXT(__GLXclientState * cl, GLbyte * pc)
|
|
|
0fd959 |
{
|
|
|
0fd959 |
const GLXContextTag tag = __GLX_GET_VENDPRIV_CONTEXT_TAG(pc);
|
|
|
0fd959 |
+ ClientPtr client = cl->client;
|
|
|
0fd959 |
|
|
|
0fd959 |
+ REQUEST_FIXED_SIZE(xGLXVendorPrivateReq, 16);
|
|
|
0fd959 |
return GetMinmax(cl, pc + __GLX_VENDPRIV_HDR_SIZE, tag);
|
|
|
0fd959 |
}
|
|
|
0fd959 |
|
|
|
0fd959 |
@@ -581,7 +601,9 @@ int
|
|
|
0fd959 |
__glXDispSwap_GetColorTable(__GLXclientState * cl, GLbyte * pc)
|
|
|
0fd959 |
{
|
|
|
0fd959 |
const GLXContextTag tag = __GLX_GET_SINGLE_CONTEXT_TAG(pc);
|
|
|
0fd959 |
+ ClientPtr client = cl->client;
|
|
|
0fd959 |
|
|
|
0fd959 |
+ REQUEST_FIXED_SIZE(xGLXSingleReq, 16);
|
|
|
0fd959 |
return GetColorTable(cl, pc + __GLX_SINGLE_HDR_SIZE, tag);
|
|
|
0fd959 |
}
|
|
|
0fd959 |
|
|
|
0fd959 |
@@ -589,6 +611,8 @@ int
|
|
|
0fd959 |
__glXDispSwap_GetColorTableSGI(__GLXclientState * cl, GLbyte * pc)
|
|
|
0fd959 |
{
|
|
|
0fd959 |
const GLXContextTag tag = __GLX_GET_VENDPRIV_CONTEXT_TAG(pc);
|
|
|
0fd959 |
+ ClientPtr client = cl->client;
|
|
|
0fd959 |
|
|
|
0fd959 |
+ REQUEST_FIXED_SIZE(xGLXVendorPrivateReq, 16);
|
|
|
0fd959 |
return GetColorTable(cl, pc + __GLX_VENDPRIV_HDR_SIZE, tag);
|
|
|
0fd959 |
}
|
|
|
0fd959 |
--
|
|
|
0fd959 |
1.9.3
|
|
|
0fd959 |
|