[PATCH] dix: disable all devices before shutdown

Peter Hutterer peter.hutterer at who-t.net
Tue May 8 16:26:00 PDT 2012


f3410b97cf9b48a47bee3d15d232f8a88e75f4ef introduced a regression on server
shutdown. If any button or key was held on shutdown (ctrl, alt, backspace
are usually still down) sending a raw event will segfault the server. The
the root windows are set to NULL before calling CloseDownDevices().

Avoid this by disabling all devices first when shutting down. Disabled
devices won't send events anymore.

Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
---
 dix/devices.c   |   15 +++++++++++++++
 dix/main.c      |    4 ++++
 include/input.h |    2 +-
 3 files changed, 20 insertions(+), 1 deletion(-)

diff --git a/dix/devices.c b/dix/devices.c
index 51a74b6..ca298b2 100644
--- a/dix/devices.c
+++ b/dix/devices.c
@@ -501,6 +501,21 @@ DisableDevice(DeviceIntPtr dev, BOOL sendevent)
     return TRUE;
 }
 
+void
+DisableAllDevices(void)
+{
+    DeviceIntPtr dev, tmp;
+
+    nt_list_for_each_entry_safe(dev, tmp, inputInfo.devices, next) {
+        if (!IsMaster(dev))
+            DisableDevice(dev, FALSE);
+    }
+    nt_list_for_each_entry_safe(dev, tmp, inputInfo.devices, next) {
+        if (dev->enabled)
+            DisableDevice(dev, FALSE);
+    }
+}
+
 /**
  * Initialise a new device through the driver and tell all clients about the
  * new device.
diff --git a/dix/main.c b/dix/main.c
index 70dcc94..df9023e 100644
--- a/dix/main.c
+++ b/dix/main.c
@@ -104,6 +104,7 @@ Equipment Corporation.
 #include "privates.h"
 #include "registry.h"
 #include "client.h"
+#include "exevents.h"
 #ifdef PANORAMIX
 #include "panoramiXsrv.h"
 #else
@@ -295,6 +296,7 @@ main(int argc, char *argv[], char *envp[])
 #endif
 
         UndisplayDevices();
+        DisableAllDevices();
 
         /* Now free up whatever must be freed */
         if (screenIsSaved == SCREEN_SAVER_ON)
@@ -318,7 +320,9 @@ main(int argc, char *argv[], char *envp[])
 
         for (i = 0; i < screenInfo.numScreens; i++)
             screenInfo.screens[i]->root = NullWindow;
+
         CloseDownDevices();
+
         CloseDownEvents();
 
         for (i = screenInfo.numScreens - 1; i >= 0; i--) {
diff --git a/include/input.h b/include/input.h
index 0e58280..3f62ec9 100644
--- a/include/input.h
+++ b/include/input.h
@@ -264,7 +264,7 @@ extern _X_EXPORT Bool ActivateDevice(DeviceIntPtr /*device */ ,
 
 extern _X_EXPORT Bool DisableDevice(DeviceIntPtr /*device */ ,
                                     BOOL /* sendevent */ );
-
+extern void DisableAllDevices(void);
 extern int InitAndStartDevices(void);
 
 extern void CloseDownDevices(void);
-- 
1.7.10.1



More information about the xorg-devel mailing list