Blame SOURCES/0030-glx-Length-checking-for-non-generated-single-request.patch

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