dix: prevent a driver from initializing or submitting buttons > MAX_BUTTONS
authorPeter Hutterer <peter.hutterer@who-t.net>
Fri, 24 Jan 2014 08:32:54 +0000 (18:32 +1000)
committerPeter Hutterer <peter.hutterer@who-t.net>
Tue, 4 Feb 2014 01:38:00 +0000 (11:38 +1000)
The server internally relies on arrays with a MAX_BUTTONS maximum size (which
is the max the core protocol can transport). Make sure a driver adheres to
that.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Reviewed-by: Daniel Stone <daniel@fooishbar.org>
dix/devices.c
dix/getevents.c

index a875f03..1c86d52 100644 (file)
@@ -1279,6 +1279,7 @@ InitButtonClassDeviceStruct(DeviceIntPtr dev, int numButtons, Atom *labels,
 
     BUG_RETURN_VAL(dev == NULL, FALSE);
     BUG_RETURN_VAL(dev->button != NULL, FALSE);
+    BUG_RETURN_VAL(numButtons >= MAX_BUTTONS, FALSE);
 
     butc = calloc(1, sizeof(ButtonClassRec));
     if (!butc)
index 646c723..ffa89fa 100644 (file)
@@ -1655,6 +1655,8 @@ GetPointerEvents(InternalEvent *events, DeviceIntPtr pDev, int type,
     }
 #endif
 
+    BUG_RETURN_VAL(buttons >= MAX_BUTTONS, 0);
+
     /* refuse events from disabled devices */
     if (!pDev->enabled)
         return 0;