[PATCH] xts5: Bail out with UNTESTED for BAD_LENGTH requests that would have length 0

Aaron Plattner aplattner at nvidia.com
Sun Oct 17 15:46:31 PDT 2010


The pBell-2 test sets the test type to BAD_LENGTH, which attempts to
create a request with a size that is too small by one long (4 bytes).
However, it tries to do this with an xBellReq, which is exactly 4
bytes in size.  This results in a request with a length field of 0,
which triggers the big request handling in the X server.  This makes
the server interpret the next request as the size part of the Bell
request, and hilarity ensues.

Instead, detect this case and bail out with an UNTESTED result.

Signed-off-by: Aaron Plattner <aplattner at nvidia.com>
---
pBell-2 and a lot of tests like it test two things: that you get BadLength
when the length is too small by one, and that you get BadLength when it's
too large by one.  The problem is that the -1 case triggers the big request
processing.  This change masks the second half of the test.  Do you guys
think it would be a good idea to split all of these tests into separate
assertions, or should I leave them the way they are?

It would be a little weird because pBell-2 and the new pBell-3 would have
the same assertion text, but would have different methods:

  520|6 2 00030251 1 3|When a client sends an invalid Bell protocol request to the
  520|6 2 00030251 1 4|X server, in which the length field of the request is not
  520|6 2 00030251 1 5|the minimum length required to contain the request, then the
  520|6 2 00030251 1 6|X server sends back a BadLength error to the client.

 xts5/src/libproto/MakeReq.c |   12 +++++++++++-
 1 files changed, 11 insertions(+), 1 deletions(-)


Here's the summary diff before and after this change:

>          CASES TESTS  PASS UNSUP UNTST NOTIU  WARN   FIP  FAIL UNRES  UNIN ABORT
>
> -Xproto    122   389   354     0     0     0     0     0    18    17     0     0
> +Xproto    122   389   369     0    19     0     0     0     1     0     0     0

diff --git a/xts5/src/libproto/MakeReq.c b/xts5/src/libproto/MakeReq.c
index df63ac6..90ed8c1 100644
--- a/xts5/src/libproto/MakeReq.c
+++ b/xts5/src/libproto/MakeReq.c
@@ -1279,7 +1279,17 @@ int type;
 	case BAD_LENGTH:
 	case JUST_TOO_LONG:
 	case TOO_LONG:
-		rp->length = bad_len;
+		if (bad_len == 0 && dpy->bigreq_size > 0) {
+		    Log_Msg("This test sends an invalid request with size zero\n");
+		    Log_Msg("  which would be interpreted as a Big Request by this\n");
+		    Log_Msg("  server, so this test cannot be performed.\n");
+		    Free_Req(rp);
+		    rp = NULL;
+		    Destroy_Client(client);
+		    Untested();
+		} else {
+		    rp->length = bad_len;
+		}
 		break;
 	default:
 		Log_Msg ("INTERNAL ERROR: Make_Req - bad test type %d\n", Get_Test_Type(client));
-- 
1.7.0.4



More information about the xorg-devel mailing list