[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

libxi: Changes to 'debian-squeeze'



 debian/changelog    |    7 ++++---
 src/XExtInt.c       |   30 +++++++++++++++++++++---------
 src/XIQueryDevice.c |    4 ++--
 3 files changed, 27 insertions(+), 14 deletions(-)

New commits:
commit 82ad336d6acb83abbe68429e26463cd3d0d085c5
Author: Julien Cristau <jcristau@debian.org>
Date:   Thu May 3 00:25:57 2012 +0200

    Upload to squeeze

diff --git a/debian/changelog b/debian/changelog
index 3a2b76f..505b3b3 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,10 +1,11 @@
-libxi (2:1.3-7) UNRELEASED; urgency=low
+libxi (2:1.3-7) squeeze; urgency=low
 
-  * Cherry-pick two patches from upstream:
+  * Cherry-pick patches from upstream:
     - Fix passive grabs
     - Fill in mods/group->effective in XIQueryPointer
+    - Handle unknown device classes (closes: #661021, #660411)
 
- -- Julien Cristau <jcristau@debian.org>  Tue, 08 Feb 2011 00:15:12 +0100
+ -- Julien Cristau <jcristau@debian.org>  Wed, 02 May 2012 23:46:50 +0200
 
 libxi (2:1.3-6) unstable; urgency=medium
 

commit cfd5d0ef79cbbcbf2b5134c13f3d9ad0685cb7a9
Author: Peter Hutterer <peter.hutterer@who-t.net>
Date:   Wed Aug 17 15:20:48 2011 +1000

    Handle unknown device classes.
    
    If the server sends an unknown device class in response to an XIQueryDevice
    call, no memory is allocated for these classes but we still write type
    and sourceid as well as setting to->classes[i]. The latter causes multiple
    classes to point to the same memory field.
    
    Move the common code of assigning these three into the respective class type
    handlers so to automatically skip any unknown classes.
    
    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
    (cherry picked from commit 91f928a70246c26cbee00bf59a8e318e9317142e)

diff --git a/src/XExtInt.c b/src/XExtInt.c
index 4b7154b..557548c 100644
--- a/src/XExtInt.c
+++ b/src/XExtInt.c
@@ -100,7 +100,7 @@ extern int _XiGetDevicePresenceNotifyEvent(
     Display *		/* dpy */
 );
 
-int copy_classes(XIDeviceInfo *to, xXIAnyInfo* from, int nclasses);
+int copy_classes(XIDeviceInfo *to, xXIAnyInfo* from, int *nclasses);
 int size_classes(xXIAnyInfo* from, int nclasses);
 
 static XExtensionInfo *xinput_info;
@@ -1445,30 +1445,29 @@ size_classes(xXIAnyInfo* from, int nclasses)
  *             |______________________^
  */
 _X_HIDDEN int
-copy_classes(XIDeviceInfo* to, xXIAnyInfo* from, int nclasses)
+copy_classes(XIDeviceInfo* to, xXIAnyInfo* from, int *nclasses)
 {
     XIAnyClassInfo *any_lib;
     xXIAnyInfo *any_wire;
     void *ptr_lib;
     char *ptr_wire;
     int i, len;
+    int cls_idx = 0;
 
     if (!to->classes)
         return -1;
 
     ptr_wire = (char*)from;
     ptr_lib = to->classes;
-    to->classes = next_block(&ptr_lib, nclasses * sizeof(XIAnyClassInfo*));
+    to->classes = next_block(&ptr_lib, *nclasses * sizeof(XIAnyClassInfo*));
+    memset(to->classes, 0, sizeof(*nclasses * sizeof(XIAnyClassInfo*)));
     len = 0; /* count wire length */
 
-    for (i = 0; i < nclasses; i++)
+    for (i = 0; i < *nclasses; i++)
     {
         any_lib = (XIAnyClassInfo*)ptr_lib;
         any_wire = (xXIAnyInfo*)ptr_wire;
 
-        to->classes[i] = any_lib;
-        any_lib->type = any_wire->type;
-        any_lib->sourceid = any_wire->sourceid;
         switch(any_wire->type)
         {
             case XIButtonClass:
@@ -1481,6 +1480,8 @@ copy_classes(XIDeviceInfo* to, xXIAnyInfo* from, int nclasses)
                     cls_lib = next_block(&ptr_lib, sizeof(XIButtonClassInfo));
                     cls_wire = (xXIButtonInfo*)any_wire;
 
+                    cls_lib->type = cls_wire->type;
+                    cls_lib->sourceid = cls_wire->sourceid;
                     cls_lib->num_buttons = cls_wire->num_buttons;
                     cls_lib->state.mask_len = ((((cls_wire->num_buttons + 7)/8) + 3)/4) * 4;
                     cls_lib->state.mask = next_block(&ptr_lib, cls_lib->state.mask_len);
@@ -1492,6 +1493,7 @@ copy_classes(XIDeviceInfo* to, xXIAnyInfo* from, int nclasses)
                     for (j = 0; j < cls_lib->num_buttons; j++)
                         cls_lib->labels[j] = *atoms++;
 
+                    to->classes[cls_idx++] = any_lib;
                     break;
                 }
             case XIKeyClass:
@@ -1502,12 +1504,15 @@ copy_classes(XIDeviceInfo* to, xXIAnyInfo* from, int nclasses)
                     cls_lib = next_block(&ptr_lib, sizeof(XIKeyClassInfo));
                     cls_wire = (xXIKeyInfo*)any_wire;
 
+                    cls_lib->type = cls_wire->type;
+                    cls_lib->sourceid = cls_wire->sourceid;
                     cls_lib->num_keycodes = cls_wire->num_keycodes;
                     cls_lib->keycodes = next_block(&ptr_lib,
                             cls_lib->num_keycodes * sizeof(int));
                     memcpy(cls_lib->keycodes, &cls_wire[1],
                             cls_lib->num_keycodes);
 
+                    to->classes[cls_idx++] = any_lib;
                     break;
                 }
             case XIValuatorClass:
@@ -1518,6 +1523,8 @@ copy_classes(XIDeviceInfo* to, xXIAnyInfo* from, int nclasses)
                     cls_lib = next_block(&ptr_lib, sizeof(XIValuatorClassInfo));
                     cls_wire = (xXIValuatorInfo*)any_wire;
 
+                    cls_lib->type = cls_wire->type;
+                    cls_lib->sourceid = cls_wire->sourceid;
                     cls_lib->number = cls_wire->number;
                     cls_lib->label  = cls_wire->label;
                     cls_lib->resolution = cls_wire->resolution;
@@ -1527,12 +1534,16 @@ copy_classes(XIDeviceInfo* to, xXIAnyInfo* from, int nclasses)
                     /* FIXME: fractional parts */
                     cls_lib->mode       = cls_wire->mode;
 
+                    to->classes[cls_idx++] = any_lib;
                 }
                 break;
         }
         len += any_wire->length * 4;
         ptr_wire += any_wire->length * 4;
     }
+
+    /* we may have skipped unknown classes, reset nclasses */
+    *nclasses = cls_idx;
     return len;
 }
 
@@ -1543,6 +1554,7 @@ wireToDeviceChangedEvent(xXIDeviceChangedEvent *in, XGenericEventCookie *cookie)
     XIDeviceChangedEvent *out;
     XIDeviceInfo info;
     int len;
+    int nclasses = in->num_classes;
 
     len = size_classes((xXIAnyInfo*)&in[1], in->num_classes);
 
@@ -1557,13 +1569,13 @@ wireToDeviceChangedEvent(xXIDeviceChangedEvent *in, XGenericEventCookie *cookie)
     out->deviceid = in->deviceid;
     out->sourceid = in->sourceid;
     out->reason = in->reason;
-    out->num_classes = in->num_classes;
 
     out->classes = (XIAnyClassInfo**)&out[1];
 
     info.classes = out->classes;
 
-    copy_classes(&info, (xXIAnyInfo*)&in[1], in->num_classes);
+    copy_classes(&info, (xXIAnyInfo*)&in[1], &nclasses);
+    out->num_classes = nclasses;
 
     return 1;
 }
diff --git a/src/XIQueryDevice.c b/src/XIQueryDevice.c
index 34c38cb..2af42d1 100644
--- a/src/XIQueryDevice.c
+++ b/src/XIQueryDevice.c
@@ -29,7 +29,7 @@
 #include <X11/extensions/extutil.h>
 #include "XIint.h"
 
-extern int copy_classes(XIDeviceInfo* to, xXIAnyInfo* from, int nclasses);
+extern int copy_classes(XIDeviceInfo* to, xXIAnyInfo* from, int *nclasses);
 extern int size_classes(xXIAnyInfo* from, int nclasses);
 
 XIDeviceInfo*
@@ -87,7 +87,7 @@ XIQueryDevice(Display *dpy, int deviceid, int *ndevices_return)
         ptr += ((wire->name_len + 3)/4) * 4;
 
         lib->classes = Xmalloc(size_classes((xXIAnyInfo*)ptr, lib->num_classes));
-        ptr += copy_classes(lib, (xXIAnyInfo*)ptr, lib->num_classes);
+        ptr += copy_classes(lib, (xXIAnyInfo*)ptr, &lib->num_classes);
     }
 
     Xfree(buf);


Reply to: