diff --git a/dix/dispatch.c b/dix/dispatch.c index 2ae2bf307..e5797583a 100644 --- a/dix/dispatch.c +++ b/dix/dispatch.c @@ -519,9 +519,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; } @@ -542,7 +543,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 115ffd81c..ceb049943 100644 --- a/os/io.c +++ b/os/io.c @@ -301,6 +301,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) {