diff --git a/dix/dispatch.c b/dix/dispatch.c index b3e5feacc..2308cfe6d 100644 --- a/dix/dispatch.c +++ b/dix/dispatch.c @@ -527,9 +527,10 @@ Dispatch(void) /* now, finally, deal with client requests */ result = ReadRequestFromClient(client); - if (result <= 0) { - if (result < 0) - CloseDownClient(client); + if (result == 0) + break; + else if (result == -1) { + CloseDownClient(client); break; } @@ -550,7 +551,7 @@ Dispatch(void) client->index, client->requestBuffer); #endif - if (result > (maxBigRequestSize << 2)) + if (result < 0 || result > (maxBigRequestSize << 2)) result = BadLength; else { result = XaceHookDispatch(client, client->majorOp); diff --git a/os/io.c b/os/io.c index 1fffaf62c..3e39c10e6 100644 --- a/os/io.c +++ b/os/io.c @@ -300,6 +300,10 @@ ReadRequestFromClient(ClientPtr client) needed = get_big_req_len(request, client); } client->req_len = needed; + if (needed > MAXINT >> 2) { + /* Check for potential integer overflow */ + return -(BadLength); + } needed <<= 2; /* needed is in bytes now */ } if (gotnow < needed) {