From: Michal Srb <[email protected]>

A client can send a big request where the 32B "length" field has value 0. When 
the big request header is removed and the is length corrected, the value will 
underflow to 0xFFFFFFFF.
Functions processing the request later will think that the client sent much 
more data and may touch memory behind the receive buffer.
---
 os/io.c | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/os/io.c b/os/io.c
index b0402912a..955c24924 100644
--- a/os/io.c
+++ b/os/io.c
@@ -441,6 +441,11 @@ ReadRequestFromClient(ClientPtr client)
     if (!gotnow)
         AvailableInput = oc;
     if (move_header) {
+        if (client->req_len < bytes_to_int32(sizeof(xBigReq) - sizeof(xReq))) {
+            YieldControlDeath();
+            return -1;
+        }
+
         request = (xReq *) oci->bufptr;
         oci->bufptr += (sizeof(xBigReq) - sizeof(xReq));
         *(xReq *) oci->bufptr = *request;
-- 
2.12.3

_______________________________________________
[email protected]: X.Org development
Archives: http://lists.x.org/archives/xorg-devel
Info: https://lists.x.org/mailman/listinfo/xorg-devel

Reply via email to