xserver: Branch 'master' - 14 commits

Peter Hutterer whot at kemper.freedesktop.org
Wed Jun 10 21:27:16 PDT 2009


 Xi/exevents.c               |    5 ++++-
 Xi/extinit.c                |    4 ++--
 Xi/querydev.c               |   11 ++++++-----
 Xi/xipassivegrab.c          |    4 ++--
 Xi/xiselectev.c             |   38 +++++++++++++++++++++++---------------
 Xi/xiselectev.h             |    4 ++--
 dix/grabs.c                 |    1 +
 hw/xfree86/modes/xf86Crtc.c |    2 +-
 include/inputstr.h          |    9 +++++++--
 9 files changed, 48 insertions(+), 30 deletions(-)

New commits:
commit 0de58c88aba7ddd69b04f24ab5b2967c359aa69e
Author: Dave Airlie <airlied at redhat.com>
Date:   Thu Jun 11 14:21:53 2009 +1000

    xfree86: move didLock assignment down to where the function pointer is valid.
    
    crtc->funcs->lock is NULL, so it's no use calling it here. Move it down so
    it's actually defined before we use it.
    
    Introduced with 6f59a8160042ea145514fdcb410f17f33fd437c2.
    
    Tested-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/hw/xfree86/modes/xf86Crtc.c b/hw/xfree86/modes/xf86Crtc.c
index 585f84d..51fe115 100644
--- a/hw/xfree86/modes/xf86Crtc.c
+++ b/hw/xfree86/modes/xf86Crtc.c
@@ -278,7 +278,6 @@ xf86CrtcSetModeTransform (xf86CrtcPtr crtc, DisplayModePtr mode, Rotation rotati
 
     adjusted_mode = xf86DuplicateMode(mode);
 
-    didLock = crtc->funcs->lock (crtc);
 
     saved_mode = crtc->mode;
     saved_x = crtc->x;
@@ -308,6 +307,7 @@ xf86CrtcSetModeTransform (xf86CrtcPtr crtc, DisplayModePtr mode, Rotation rotati
 	goto done;
     }
 
+    didLock = crtc->funcs->lock (crtc);
     /* Pass our mode to the outputs and the CRTC to give them a chance to
      * adjust it according to limitations or output properties, and also
      * a chance to reject the mode entirely.
commit a85d210b34506cb39e7f08d81d4586fe4448b47f
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Thu Jun 11 12:32:39 2009 +1000

    Xi: store mask_len before swapping in ProcXIGetSelectedEvents.
    
    Swapping the mask_len and then advancing the pointer by the swapped length
    is just a bad idea.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xi/xiselectev.c b/Xi/xiselectev.c
index f2c6b9a..1259de5 100644
--- a/Xi/xiselectev.c
+++ b/Xi/xiselectev.c
@@ -224,10 +224,9 @@ ProcXIGetSelectedEvents(ClientPtr client)
         {
             if (devmask[j] != 0)
             {
+                int mask_len = (j + 4)/4; /* j is an index, hence + 4, not + 3 */
                 evmask->deviceid = i;
-                evmask->mask_len = (j + 4)/4; /* j is an index, hence + 4,
-                                                 not + 3 */
-
+                evmask->mask_len = mask_len;
                 reply.num_masks++;
                 reply.length += sizeof(xXIEventMask)/4 + evmask->mask_len;
 
@@ -239,7 +238,7 @@ ProcXIGetSelectedEvents(ClientPtr client)
 
                 memcpy(&evmask[1], devmask, j + 1);
                 evmask = (xXIEventMask*)((char*)evmask +
-                           sizeof(xXIEventMask) + evmask->mask_len * 4);
+                           sizeof(xXIEventMask) + mask_len * 4);
                 break;
             }
         }
commit 5043f42f36b49e7702d0c496dd4fe157788d44ee
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Thu Jun 11 12:31:40 2009 +1000

    Xi: correct return buffer size for XIGetSelectedEvents.
    
    The maximum number of bytes is calculated by the mask len, and the mask len
    is always in 4-byte units. XI2MASKSIZE however is in bytes.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xi/xiselectev.c b/Xi/xiselectev.c
index cafb976..f2c6b9a 100644
--- a/Xi/xiselectev.c
+++ b/Xi/xiselectev.c
@@ -202,7 +202,7 @@ ProcXIGetSelectedEvents(ClientPtr client)
         return Success;
     }
 
-    buffer = xcalloc(MAXDEVICES, sizeof(xXIEventMask) + XI2MASKSIZE);
+    buffer = xcalloc(MAXDEVICES, sizeof(xXIEventMask) + ((XI2MASKSIZE + 3)/4) * 4);
     if (!buffer)
         return BadAlloc;
 
commit fcf0c0b8f332cbde03c1a479376b7913197962eb
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Thu Jun 11 13:23:40 2009 +1000

    Xi: XISetEventMask needs to clear the mask if len is 0
    
    zero-length masks are supposed to clear the device's mask.
    ProcXISelectEvents passes these masks through directly, so we need to clear
    the bits here if such a mask is supplied.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xi/exevents.c b/Xi/exevents.c
index fbcf6e3..23d8ee8 100644
--- a/Xi/exevents.c
+++ b/Xi/exevents.c
@@ -2167,7 +2167,10 @@ XISetEventMask(DeviceIntPtr dev, WindowPtr win, ClientPtr client,
         others= wOtherInputMasks(win)->inputClients;
     }
 
-    memcpy(others->xi2mask[dev->id], mask, len);
+    if (!len)
+        memset(others->xi2mask[dev->id], 0, sizeof(others->xi2mask[dev->id]));
+    else
+        memcpy(others->xi2mask[dev->id], mask, len);
 
     RecalculateDeviceDeliverableEvents(win);
 }
commit 22b4ac44e4fdbe8f36f2b570cdbdaf237062e33e
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Thu Jun 11 11:08:07 2009 +1000

    Xi: XIGetSelectedEvents mustn't returned masks from non-existing devices.
    
    Or devices the client doesn't have XACE permissions for.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xi/xiselectev.c b/Xi/xiselectev.c
index 74e444b..cafb976 100644
--- a/Xi/xiselectev.c
+++ b/Xi/xiselectev.c
@@ -170,6 +170,7 @@ ProcXIGetSelectedEvents(ClientPtr client)
     OtherInputMasks *masks;
     InputClientsPtr others = NULL;
     xXIEventMask *evmask = NULL;
+    DeviceIntPtr dev;
 
     REQUEST(xXIGetSelectedEventsReq);
     REQUEST_SIZE_MATCH(xXIGetSelectedEventsReq);
@@ -211,6 +212,14 @@ ProcXIGetSelectedEvents(ClientPtr client)
         int j;
         unsigned char *devmask = others->xi2mask[i];
 
+        if (i > 2)
+        {
+            rc = dixLookupDevice(&dev, i, client, DixReadAccess);
+            if (rc != Success)
+                continue;
+        }
+
+
         for (j = XI2MASKSIZE - 1; j >= 0; j--)
         {
             if (devmask[j] != 0)
commit 7868956b0fb50a9d77506f01413612e429f540a3
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Wed Jun 10 17:09:39 2009 +1000

    Xi: ProcXIGetSelectedEvents must use WriteToClient for swapped data.
    
    The data is already swapped before, so we just post it to the client as-is,
    without attempting to swap it again.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xi/xiselectev.c b/Xi/xiselectev.c
index 6498d86..74e444b 100644
--- a/Xi/xiselectev.c
+++ b/Xi/xiselectev.c
@@ -239,10 +239,7 @@ ProcXIGetSelectedEvents(ClientPtr client)
     WriteReplyToClient(client, sizeof(xXIGetSelectedEventsReply), &reply);
 
     if (reply.num_masks)
-    {
-        WriteSwappedDataToClient(client, reply.length * 4, buffer);
-    }
-
+        WriteToClient(client, reply.length * 4, buffer);
 
     xfree(buffer);
     return Success;
commit aa2babf11c30be4d289b58212dc330b84efb4053
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Wed Jun 10 14:41:11 2009 +1000

    input: remove dependency on XI2 protocol for XI_LASTEVENT.
    
    inputstr includes XI2proto.h for the sole purpose of XI_LASTEVENT.
    However, using XI_LASTEVENT in the server is prone to errors, if the server
    is recompiled against a newer version of the protocol it would bump this
    variable and associates bits, including potential ABI.
    
    This patch defines an XI2LASTEVENT for use in the server and removes the
    XI2proto.h require. XI2LASTEVENT is the current value of XI_LASTEVENT.
    
    This patch is required by components that require access to inputInfo
    (currently xf86-video-geode and xf86-video-cirrus) but should not have a
    require for the XI2 protocol.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xi/xipassivegrab.c b/Xi/xipassivegrab.c
index 25ecc03..a5a9570 100644
--- a/Xi/xipassivegrab.c
+++ b/Xi/xipassivegrab.c
@@ -120,10 +120,10 @@ ProcXIPassiveGrabDevice(ClientPtr client)
         return BadValue;
     }
 
-    if ((stuff->mask_len * 4) > XI_LASTEVENT)
+    if ((stuff->mask_len * 4) > XI2LASTEVENT)
     {
         unsigned char *bits = (unsigned char*)&stuff[1];
-        for (i = XI_LASTEVENT; i < stuff->mask_len * 4; i++)
+        for (i = XI2LASTEVENT; i < stuff->mask_len * 4; i++)
         {
             if (BitIsOn(bits, i))
                 return BadValue;
diff --git a/Xi/xiselectev.c b/Xi/xiselectev.c
index e6f36a7..6498d86 100644
--- a/Xi/xiselectev.c
+++ b/Xi/xiselectev.c
@@ -108,10 +108,10 @@ ProcXISelectEvents(ClientPtr client)
                 return BadValue;
         }
 
-        if ((evmask->mask_len * 4) >= (XI_LASTEVENT + 8)/8)
+        if ((evmask->mask_len * 4) >= (XI2LASTEVENT + 8)/8)
         {
             unsigned char *bits = (unsigned char*)&evmask[1];
-            for (i = XI_LASTEVENT + 1; i < evmask->mask_len * 4; i++)
+            for (i = XI2LASTEVENT + 1; i < evmask->mask_len * 4; i++)
             {
                 if (BitIsOn(bits, i))
                     return BadValue;
diff --git a/dix/grabs.c b/dix/grabs.c
index cc77477..06d6d03 100644
--- a/dix/grabs.c
+++ b/dix/grabs.c
@@ -53,6 +53,7 @@ SOFTWARE.
 #include <X11/X.h>
 #include "misc.h"
 #include <X11/Xproto.h>
+#include <X11/extensions/XI2.h>
 #include "windowstr.h"
 #include "inputstr.h"
 #include "cursorstr.h"
diff --git a/include/inputstr.h b/include/inputstr.h
index f233034..ffeedb1 100644
--- a/include/inputstr.h
+++ b/include/inputstr.h
@@ -55,7 +55,6 @@ SOFTWARE.
 #include "cursorstr.h"
 #include "geext.h"
 #include "privates.h"
-#include <X11/extensions/XI2proto.h>
 
 #define BitIsOn(ptr, bit) (((BYTE *) (ptr))[(bit)>>3] & (1 << ((bit) & 7)))
 #define SetBit(ptr, bit)  (((BYTE *) (ptr))[(bit)>>3] |= (1 << ((bit) & 7)))
@@ -65,7 +64,13 @@ SOFTWARE.
 	(CLIENT_BITS((obj)->resource) == (client)->clientAsMask)
 
 #define EMASKSIZE	MAXDEVICES + 2
-#define XI2MASKSIZE     ((XI_LASTEVENT + 7)/8) /* no of bits for masks */
+
+/* This is the last XI2 event supported by the server. If you add
+ * events to the protocol, the server will not support these events until
+ * this number here is bumped.
+ */
+#define XI2LASTEVENT    13 /* XI_PropertyEvent */
+#define XI2MASKSIZE     ((XI2LASTEVENT + 7)/8) /* no of bits for masks */
 
 /**
  * This struct stores the core event mask for each client except the client
commit 77cc816da4a2777110182ed01c22c0f5e6ac3b65
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Wed Jun 10 13:54:42 2009 +1000

    Xi: rename ProcXISelectEvent to ProcXISelectEvents.
    
    The request name has the plural, so let's do it here too. Purely cosmetic
    change.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xi/extinit.c b/Xi/extinit.c
index 635afea..0550bd4 100644
--- a/Xi/extinit.c
+++ b/Xi/extinit.c
@@ -244,7 +244,7 @@ static int (*ProcIVector[])(ClientPtr) = {
         ProcXIChangeHierarchy,                  /* 43 */
         ProcXISetClientPointer,                 /* 44 */
         ProcXIGetClientPointer,                 /* 45 */
-        ProcXISelectEvent,                      /* 46 */
+        ProcXISelectEvents,                     /* 46 */
         ProcXIQueryVersion,                     /* 47 */
         ProcXIQueryDevice,                      /* 48 */
         ProcXISetFocus,                         /* 49 */
@@ -309,7 +309,7 @@ static int (*SProcIVector[])(ClientPtr) = {
         SProcXIChangeHierarchy,                  /* 43 */
         SProcXISetClientPointer,                 /* 44 */
         SProcXIGetClientPointer,                 /* 45 */
-        SProcXISelectEvent,                      /* 46 */
+        SProcXISelectEvents,                     /* 46 */
         SProcXIQueryVersion,                     /* 47 */
         SProcXIQueryDevice,                      /* 48 */
         SProcXISetFocus,                         /* 49 */
diff --git a/Xi/xiselectev.c b/Xi/xiselectev.c
index 98b5919..e6f36a7 100644
--- a/Xi/xiselectev.c
+++ b/Xi/xiselectev.c
@@ -37,7 +37,7 @@
 #include "xiselectev.h"
 
 int
-SProcXISelectEvent(ClientPtr client)
+SProcXISelectEvents(ClientPtr client)
 {
     char n;
     int i;
@@ -57,11 +57,11 @@ SProcXISelectEvent(ClientPtr client)
         evmask = (xXIEventMask*)(((char*)evmask) + evmask->mask_len * 4);
     }
 
-    return (ProcXISelectEvent(client));
+    return (ProcXISelectEvents(client));
 }
 
 int
-ProcXISelectEvent(ClientPtr client)
+ProcXISelectEvents(ClientPtr client)
 {
     int rc, num_masks, i;
     WindowPtr win;
diff --git a/Xi/xiselectev.h b/Xi/xiselectev.h
index 5f5ffe3..5efc648 100644
--- a/Xi/xiselectev.h
+++ b/Xi/xiselectev.h
@@ -27,8 +27,8 @@
 #include <dix-config.h>
 #endif
 
-int SProcXISelectEvent(ClientPtr client);
-int ProcXISelectEvent(ClientPtr client);
+int SProcXISelectEvents(ClientPtr client);
+int ProcXISelectEvents(ClientPtr client);
 int SProcXIGetSelectedEvents(ClientPtr client);
 int ProcXIGetSelectedEvents(ClientPtr client);
 void SRepXIGetSelectedEvents(ClientPtr client,
commit 9563feeeb5309de1971c4e04419fed6fd31c9cea
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Tue Jun 9 16:57:09 2009 +1000

    Xi: start checking for invalid mask bits _after_ LASTEVENT.
    
    Two issues that combined to false positives and false negatives.
    - The checking for invalid bits must be performed when there are enough bits
    that an event outside of LASTEVENT may be selected.
    - The first invalid bit is LASTEVENT + 1, not LASTEVENT.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xi/xiselectev.c b/Xi/xiselectev.c
index 6734da9..98b5919 100644
--- a/Xi/xiselectev.c
+++ b/Xi/xiselectev.c
@@ -108,10 +108,10 @@ ProcXISelectEvent(ClientPtr client)
                 return BadValue;
         }
 
-        if ((evmask->mask_len * 4) > XI_LASTEVENT)
+        if ((evmask->mask_len * 4) >= (XI_LASTEVENT + 8)/8)
         {
             unsigned char *bits = (unsigned char*)&evmask[1];
-            for (i = XI_LASTEVENT; i < evmask->mask_len * 4; i++)
+            for (i = XI_LASTEVENT + 1; i < evmask->mask_len * 4; i++)
             {
                 if (BitIsOn(bits, i))
                     return BadValue;
commit e2fbaebb87e18198143a4b8e6be7e650563cd819
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Tue Jun 9 14:38:25 2009 +1000

    Xi: XISelectEvents returns BadValue for num_masks == 0.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xi/xiselectev.c b/Xi/xiselectev.c
index 8c1b2b1..6734da9 100644
--- a/Xi/xiselectev.c
+++ b/Xi/xiselectev.c
@@ -73,6 +73,9 @@ ProcXISelectEvent(ClientPtr client)
     REQUEST(xXISelectEventsReq);
     REQUEST_AT_LEAST_SIZE(xXISelectEventsReq);
 
+    if (stuff->num_masks == 0)
+        return BadValue;
+
     rc = dixLookupWindow(&win, stuff->window, client, DixReceiveAccess);
     if (rc != Success)
         return rc;
commit cfeb65ac45b194dead5e8b9b26192df2619d6f9c
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Tue Jun 9 14:37:42 2009 +1000

    Xi: XISelectEvents needs to be at least size 3, not exactly.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xi/xiselectev.c b/Xi/xiselectev.c
index 51d9c99..8c1b2b1 100644
--- a/Xi/xiselectev.c
+++ b/Xi/xiselectev.c
@@ -45,7 +45,7 @@ SProcXISelectEvent(ClientPtr client)
 
     REQUEST(xXISelectEventsReq);
     swaps(&stuff->length, n);
-    REQUEST_SIZE_MATCH(xXISelectEventsReq);
+    REQUEST_AT_LEAST_SIZE(xXISelectEventsReq);
     swapl(&stuff->window, n);
     swaps(&stuff->num_masks, n);
 
commit f3c26034eca98924d93a004aaa1f61ffe5d344ca
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Tue Jun 9 13:04:56 2009 +1000

    Xi: XIQueryDevice should use XIFooClass instead of the old FooClass defines.
    
    This is merely a cosmetic change, the actual values are the same anyway.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xi/querydev.c b/Xi/querydev.c
index 22a5537..fd5e463 100644
--- a/Xi/querydev.c
+++ b/Xi/querydev.c
@@ -428,13 +428,13 @@ SwapDeviceInfo(DeviceIntPtr dev, xXIDeviceInfo* info)
         int len = ((xXIAnyInfo*)any)->length;
         switch(((xXIAnyInfo*)any)->type)
         {
-            case ButtonClass:
+            case XIButtonClass:
                 SwapButtonInfo(dev, (xXIButtonInfo*)any);
                 break;
-            case KeyClass:
+            case XIKeyClass:
                 SwapKeyInfo(dev, (xXIKeyInfo*)any);
                 break;
-            case ValuatorClass:
+            case XIValuatorClass:
                 SwapValuatorInfo(dev, (xXIValuatorInfo*)any);
                 break;
         }
commit 482cc72aa790bd2f23c7ebe12c5549b47c737115
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Tue Jun 9 13:03:38 2009 +1000

    Xi: get the class length before swapping.
    
    Advancing by the already-swapped length lets our pointers point into
    nirvana.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xi/querydev.c b/Xi/querydev.c
index 1f7fed1..22a5537 100644
--- a/Xi/querydev.c
+++ b/Xi/querydev.c
@@ -425,6 +425,7 @@ SwapDeviceInfo(DeviceIntPtr dev, xXIDeviceInfo* info)
 
     for (i = 0; i < info->num_classes; i++)
     {
+        int len = ((xXIAnyInfo*)any)->length;
         switch(((xXIAnyInfo*)any)->type)
         {
             case ButtonClass:
@@ -438,7 +439,7 @@ SwapDeviceInfo(DeviceIntPtr dev, xXIDeviceInfo* info)
                 break;
         }
 
-        any += (((xXIAnyInfo*)any)->length * 4);
+        any += len * 4;
     }
 
     swaps(&info->deviceid, n);
commit 9974249980894f74f3ead466655da87958a43670
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Tue Jun 9 13:02:52 2009 +1000

    Xi: Swapping 32 bit keycodes requires swapl, not swaps.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xi/querydev.c b/Xi/querydev.c
index a44cf22..1f7fed1 100644
--- a/Xi/querydev.c
+++ b/Xi/querydev.c
@@ -284,7 +284,7 @@ SwapKeyInfo(DeviceIntPtr dev, xXIKeyInfo* info)
     swaps(&info->length, n);
 
     for (i = 0, key = (uint32_t*)&info[1]; i < info->num_keycodes; i++, key++)
-        swaps(key, n);
+        swapl(key, n);
 
     swaps(&info->num_keycodes, n);
 }


More information about the xorg-commit mailing list