[PATCH xserver 09/10] Input: Set client error value for invalid mask bits

Daniel Stone daniel at fooishbar.org
Fri Dec 17 09:13:34 PST 2010


When we send BadValue back to the client for having invalid mask bits,
at least tell them what the (first) invalid bit was.

Signed-off-by: Daniel Stone <daniel at fooishbar.org>
---
 Xi/xigrabdev.c     |    2 +-
 Xi/xipassivegrab.c |    2 +-
 Xi/xiselectev.c    |   15 +++++++++++++--
 include/exevents.h |    2 +-
 4 files changed, 16 insertions(+), 5 deletions(-)

diff --git a/Xi/xigrabdev.c b/Xi/xigrabdev.c
index 24ededc..0adc878 100644
--- a/Xi/xigrabdev.c
+++ b/Xi/xigrabdev.c
@@ -79,7 +79,7 @@ ProcXIGrabDevice(ClientPtr client)
     if (!IsMaster(dev))
         stuff->paired_device_mode = GrabModeAsync;
 
-    if (XICheckInvalidMaskBits((unsigned char*)&stuff[1],
+    if (XICheckInvalidMaskBits(client, (unsigned char*)&stuff[1],
                                stuff->mask_len * 4) != Success)
         return BadValue;
 
diff --git a/Xi/xipassivegrab.c b/Xi/xipassivegrab.c
index c5f7bf0..972988e 100644
--- a/Xi/xipassivegrab.c
+++ b/Xi/xipassivegrab.c
@@ -129,7 +129,7 @@ ProcXIPassiveGrabDevice(ClientPtr client)
         return BadValue;
     }
 
-    if (XICheckInvalidMaskBits((unsigned char*)&stuff[1],
+    if (XICheckInvalidMaskBits(client, (unsigned char*)&stuff[1],
                                stuff->mask_len * 4) != Success)
         return BadValue;
 
diff --git a/Xi/xiselectev.c b/Xi/xiselectev.c
index 64ee173..edbd156 100644
--- a/Xi/xiselectev.c
+++ b/Xi/xiselectev.c
@@ -42,14 +42,19 @@
  *
  * @return BadValue if at least one invalid bit is set or Success otherwise.
  */
-int XICheckInvalidMaskBits(unsigned char *mask, int len)
+int XICheckInvalidMaskBits(ClientPtr client, unsigned char *mask, int len)
 {
     if (len >= XIMaskLen(XI2LASTEVENT))
     {
         int i;
         for (i = XI2LASTEVENT + 1; i < len * 8; i++)
+        {
             if (BitIsOn(mask, i))
+            {
+                client->errorValue = i;
                 return BadValue;
+            }
+        }
     }
 
     return Success;
@@ -126,7 +131,10 @@ ProcXISelectEvents(ClientPtr client)
         {
             unsigned char *bits = (unsigned char*)&evmask[1];
             if (BitIsOn(bits, XI_HierarchyChanged))
+            {
+                client->errorValue = XI_HierarchyChanged;
                 return BadValue;
+            }
         }
 
         /* Raw events may only be selected on root windows */
@@ -138,7 +146,10 @@ ProcXISelectEvents(ClientPtr client)
                 BitIsOn(bits, XI_RawButtonPress) ||
                 BitIsOn(bits, XI_RawButtonRelease) ||
                 BitIsOn(bits, XI_RawMotion))
+            {
+                client->errorValue = XI_RawKeyPress;
                 return BadValue;
+            }
         }
 
         if (evmask->mask_len >= 1)
@@ -182,7 +193,7 @@ ProcXISelectEvents(ClientPtr client)
             }
         }
 
-        if (XICheckInvalidMaskBits((unsigned char*)&evmask[1],
+        if (XICheckInvalidMaskBits(client, (unsigned char*)&evmask[1],
                                    evmask->mask_len * 4) != Success)
             return BadValue;
 
diff --git a/include/exevents.h b/include/exevents.h
index ae45054..32a3962 100644
--- a/include/exevents.h
+++ b/include/exevents.h
@@ -327,6 +327,6 @@ XISetEventMask(DeviceIntPtr dev, WindowPtr win, ClientPtr client,
                            unsigned int len, unsigned char* mask);
 
 extern int
-XICheckInvalidMaskBits(unsigned char *mask, int len);
+XICheckInvalidMaskBits(ClientPtr client, unsigned char *mask, int len);
 
 #endif /* EXEVENTS_H */
-- 
1.7.2.3



More information about the xorg-devel mailing list