diff options
author | Peter Hutterer <peter.hutterer@who-t.net> | 2012-05-09 09:21:28 +1000 |
---|---|---|
committer | Peter Hutterer <peter.hutterer@who-t.net> | 2012-06-07 14:13:51 +1000 |
commit | 4c68f5d395c66f28b56e488cb3cd12f36820357b (patch) | |
tree | 01e3567eb7377f8b7559360bb2ab358d4c412845 /dix/main.c | |
parent | 9c0e820216cd1631f75b037b7908d55ac091692c (diff) |
dix: disable all devices before shutdown
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.
Master keyboards must be disabled first, otherwise disabling the pointer
will trigger DisableDevice(keyboard) and the keyboard is removed from the
inputInfo.devices list and moved to inputInfo.off_devices. A regular loop
through inputInfo.devices would thus jump to off_devices and not recover.
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Acked-by: Chase Douglas <chase.douglas@canonical.com>
Reviewed-by: Chase Douglas <chase.douglas@canonical.com>
Diffstat (limited to 'dix/main.c')
-rw-r--r-- | dix/main.c | 4 |
1 files changed, 4 insertions, 0 deletions
diff --git a/dix/main.c b/dix/main.c index 70dcc946e..df9023e97 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--) { |