Compare commits

...
Sign in to create a new pull request.

2 commits

Author SHA1 Message Date
Peter Hutterer
e3d78770b5 libXi 1.4.5 - protects against newer inputproto headers 2011-12-20 10:28:54 +10:00
Peter Hutterer
aad24cf8f3 libXi 1.4.4 with two memory corruption fixes (one of them the one from
1.4.4-3)
2011-12-16 08:08:26 +10:00
4 changed files with 12 additions and 182 deletions

2
.gitignore vendored
View file

@ -2,3 +2,5 @@ libXi-1.4.0.tar.bz2
/libXi-1.4.1.tar.bz2
/libXi-1.4.2.tar.bz2
/libXi-1.4.3.tar.bz2
/libXi-1.4.4.tar.bz2
/libXi-1.4.5.tar.bz2

View file

@ -1,176 +0,0 @@
From 635c2c029b1e73311c3f650bcaf7eeb9e782134b Mon Sep 17 00:00:00 2001
From: Peter Hutterer <peter.hutterer@who-t.net>
Date: Wed, 17 Aug 2011 15:20:48 +1000
Subject: [PATCH] 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>
---
src/XExtInt.c | 30 +++++++++++++++++++++---------
src/XIQueryDevice.c | 4 ++--
2 files changed, 23 insertions(+), 11 deletions(-)
diff --git a/src/XExtInt.c b/src/XExtInt.c
index 86a780e..9e1ad19 100644
--- a/src/XExtInt.c
+++ b/src/XExtInt.c
@@ -98,7 +98,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;
@@ -1448,30 +1448,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:
@@ -1485,6 +1484,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;
size = ((((cls_wire->num_buttons + 7)/8) + 3)/4);
cls_lib->state.mask_len = size * 4;
@@ -1499,6 +1500,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:
@@ -1509,12 +1511,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:
@@ -1525,6 +1530,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;
@@ -1534,12 +1541,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;
}
@@ -1550,6 +1561,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);
@@ -1564,13 +1576,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 4e2f392..c22aee1 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);
--
1.7.6.4

View file

@ -3,8 +3,8 @@
Summary: X.Org X11 libXi runtime library
Name: libXi
Version: 1.4.3
Release: 3%{?dist}
Version: 1.4.5
Release: 1%{?dist}
License: MIT
Group: System Environment/Libraries
URL: http://www.x.org
@ -13,8 +13,6 @@ Source0: ftp://ftp.x.org/pub/individual/lib/%{name}-%{version}.tar.bz2
#Source0: %{tarball}-%{gitdate}.tar.bz2
Source1: make-git-snapshot.sh
Patch01: 0001-Handle-unknown-device-classes.patch
BuildRequires: autoconf automake libtool
BuildRequires: xorg-x11-util-macros
BuildRequires: xorg-x11-proto-devel
@ -40,7 +38,6 @@ X.Org X11 libXi development package
%prep
%setup -q
#setup -q -n %{tarball}-%{gitdate}
%patch01 -p1
# Disable static library creation by default.
%define with_static 0
@ -87,6 +84,13 @@ rm -rf $RPM_BUILD_ROOT
%{_mandir}/man3/*.3*
%changelog
* Tue Dec 20 2011 Peter Hutterer <peter.hutterer@redhat.com> 1.4.5-1
- libXi 1.4.5 - protects against newer inputproto headers
* Fri Dec 16 2011 Peter Hutterer <peter.hutterer@redhat.com> 1.4.4-1
- libXi 1.4.4 with two memory corruption fixes (one of them the one from
1.4.4-3)
* Tue Oct 11 2011 Peter Hutterer <peter.hutterer@redhat.com> 1.4.3-3
- Fix 0001-Handle-unknown-device-classes.patch: missing prototype change for
copy_classes in XIQueryDevice caused parameter corruption (#744960)

View file

@ -1 +1 @@
792e8a7ddc7175911d69f823d38eaff6 libXi-1.4.3.tar.bz2
82dcdc76388116800a2c3ad969f510a4 libXi-1.4.5.tar.bz2