These devices are used as placeholders for devices in passive grabs and
replaced with the real device once the grab activates. The current static
allocation means they don't have devPrivates allocated. If SELinux is
enabled and a client registers a passive grab on XIAll(Master)Devices, this
causes a null-pointer dereference of obj in SELinuxDevice().

X.Org Bug 50641 <http://bugs.freedesktop.org/show_bug.cgi?id=50641>

Signed-off-by: Peter Hutterer <peter.hutte...@who-t.net>
---
This fixes the crash, the devices we used for passive grabs were special
when they dont need to be (anymore). Creating them normally means we get a
devPrivate and the crash goes away.

That's only one half of the problem though, afaict we still activate grabs
on devices that may be restricted.

You'll also need the list.h patch I just sent out
http://patchwork.freedesktop.org/patch/11050/

 Xi/extinit.c  |   16 ----------------
 dix/devices.c |   17 +++++++++++++++++
 2 files changed, 17 insertions(+), 16 deletions(-)

diff --git a/Xi/extinit.c b/Xi/extinit.c
index 94f46f7..5a691f8 100644
--- a/Xi/extinit.c
+++ b/Xi/extinit.c
@@ -185,9 +185,6 @@ static struct dev_type {
 CARD8 event_base[numInputClasses];
 XExtEventInfo EventInfo[32];
 
-static DeviceIntRec xi_all_devices;
-static DeviceIntRec xi_all_master_devices;
-
 /**
  * Dispatch vector. Functions defined in here will be called when the matching
  * request arrives.
@@ -1137,9 +1134,6 @@ IResetProc(ExtensionEntry * unused)
     EventSwapVector[DevicePresenceNotify] = NotImplemented;
     EventSwapVector[DevicePropertyNotify] = NotImplemented;
     RestoreExtensionEvents();
-
-    free(xi_all_devices.name);
-    free(xi_all_master_devices.name);
 }
 
 /***********************************************************************
@@ -1298,16 +1292,6 @@ XInputExtensionInit(void)
 
         GERegisterExtension(IReqCode, XI2EventSwap);
 
-        memset(&xi_all_devices, 0, sizeof(xi_all_devices));
-        memset(&xi_all_master_devices, 0, sizeof(xi_all_master_devices));
-        xi_all_devices.id = XIAllDevices;
-        xi_all_devices.name = strdup("XIAllDevices");
-        xi_all_master_devices.id = XIAllMasterDevices;
-        xi_all_master_devices.name = strdup("XIAllMasterDevices");
-
-        inputInfo.all_devices = &xi_all_devices;
-        inputInfo.all_master_devices = &xi_all_master_devices;
-
         XIResetProperties();
     }
     else {
diff --git a/dix/devices.c b/dix/devices.c
index 08875bc..b1e1079 100644
--- a/dix/devices.c
+++ b/dix/devices.c
@@ -675,6 +675,20 @@ CorePointerProc(DeviceIntPtr pDev, int what)
 void
 InitCoreDevices(void)
 {
+    inputInfo.all_devices = AddInputDevice(serverClient, NULL, TRUE);
+    inputInfo.all_master_devices = AddInputDevice(serverClient, NULL, TRUE);
+
+    if (!inputInfo.all_devices || !inputInfo.all_master_devices)
+         FatalError("Failed to allocate XIAllDevices/XIAllMasterDevices");
+
+    inputInfo.all_devices->id = XIAllDevices;
+    inputInfo.all_master_devices->id = XIAllMasterDevices;
+
+    nt_list_del(inputInfo.all_devices, inputInfo.devices, DeviceIntRec, next);
+    nt_list_del(inputInfo.all_devices, inputInfo.off_devices, DeviceIntRec, 
next);
+    nt_list_del(inputInfo.all_master_devices, inputInfo.devices, DeviceIntRec, 
next);
+    nt_list_del(inputInfo.all_master_devices, inputInfo.off_devices, 
DeviceIntRec, next);
+
     if (AllocDevicePair(serverClient, "Virtual core",
                         &inputInfo.pointer, &inputInfo.keyboard,
                         CorePointerProc, CoreKeyboardProc, TRUE) != Success)
@@ -1021,6 +1035,9 @@ CloseDownDevices(void)
 
     CloseDevice(inputInfo.keyboard);
 
+    CloseDevice(inputInfo.all_devices);
+    CloseDevice(inputInfo.all_master_devices);
+
     inputInfo.devices = NULL;
     inputInfo.off_devices = NULL;
     inputInfo.keyboard = NULL;
-- 
1.7.10.4

_______________________________________________
xorg-devel@lists.x.org: X.Org development
Archives: http://lists.x.org/archives/xorg-devel
Info: http://lists.x.org/mailman/listinfo/xorg-devel

Reply via email to