[PATCH] xts5: Realloc the reply buffer instead of failing

Aaron Plattner aplattner at nvidia.com
Wed Apr 18 15:23:52 PDT 2012


The default window size for test windows is Screen_Width/2 x Screen_Height/2.
When the screen is really big, this can result in a very large window, which
makes for a very large reply in the pGetImage tests.  If this reply is larger
than max_extra, the test fails.  This failure is bogus -- at the very least, it
should be UNRESOLVED instead.

Instead of failing in this case, just make rbuf be dynamically-allocated and
realloc it bigger as necessary.  Fixes Xproto/GetImage-1 when the root window is
very large.

Signed-off-by: Aaron Plattner <aplattner at nvidia.com>
---
 xts5/src/libproto/Expect.c |   28 +++++++++++++++++++++-------
 1 files changed, 21 insertions(+), 7 deletions(-)

diff --git a/xts5/src/libproto/Expect.c b/xts5/src/libproto/Expect.c
index cd93411..bdd6142 100644
--- a/xts5/src/libproto/Expect.c
+++ b/xts5/src/libproto/Expect.c
@@ -138,8 +138,8 @@ SOFTWARE.
 	int *countp = (Get_Test_Type(cl)==SETUP)?(&Xst_delete_count):(&Xst_error_count);\
 	if (*countp>0) (*countp)--; } while (0)
 
-static int  max_extra = IBUFSIZE - sizeof (xReply);
-static char rbuf[IBUFSIZE];
+static char *rbuf;
+static size_t rbuf_size;
 static char *rbp;
 static char *enames ();
 static char wanted[132];
@@ -327,6 +327,15 @@ int     type;     /* request type */
 	Poll_Server (client);
     }
 
+    if (!rbuf) {
+	rbuf_size = IBUFSIZE;
+	rbuf = Xstmalloc (rbuf_size);
+	if (!rbuf) {
+	    Log_Msg ("Could not allocate %d bytes to store reply data\n", rbuf_size);
+	    Finish (client);
+	}
+    }
+
 /*
  *	Now cycle through the messages coming back until we get something
  *	which corresponds explicitly to the last request sent
@@ -404,12 +413,17 @@ int     type;     /* request type */
 	    case X_Reply: 
 		extra = (rep -> generic.length << 2);
 		if (extra > 0) {/* more to read */
-		    if (extra > max_extra) {
-			Log_Msg ("Expect: too big a reply");
-			Show_Rep (rep, UNKNOWN_REQUEST_TYPE, so_far);
-			Finish  (client);
-		    }
 		    so_far = (long) extra + sizeof (xReply);
+		    if (so_far > rbuf_size) {
+			fprintf(stderr, "Reallocing rbuf from %d to %d\n", rbuf_size, so_far);
+			rbuf_size = so_far;
+			rbuf = Xstrealloc (rbuf, so_far);
+			if (!rbuf) {
+			    Log_Msg ("Could not allocate %d bytes to store reply data\n",
+				     rbuf_size);
+			    Finish (client);
+			}
+		    }
 		    rep = (xReply *) Xstrealloc ((char *) rep, (unsigned) so_far);
 		    Get_Me_That (client, (char *) rbuf + sizeof (xReply), extra);
 		}
-- 
1.7.5.4



More information about the xorg-test mailing list