[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