diff --git a/dix/dispatch.c b/dix/dispatch.c index 29a2415d9..7fc3a0554 100644 --- a/dix/dispatch.c +++ b/dix/dispatch.c @@ -517,9 +517,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; } @@ -540,7 +541,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 1e9258cd0..9e483aed5 100644 --- a/os/io.c +++ b/os/io.c @@ -299,6 +299,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) {