diff options
Diffstat (limited to 'debian/patches/01-retry-console-open-on-EIO.patch')
-rw-r--r-- | debian/patches/01-retry-console-open-on-EIO.patch | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/debian/patches/01-retry-console-open-on-EIO.patch b/debian/patches/01-retry-console-open-on-EIO.patch new file mode 100644 index 0000000..5f81f94 --- /dev/null +++ b/debian/patches/01-retry-console-open-on-EIO.patch @@ -0,0 +1,61 @@ +From 3665e8094e50f1f70b02a34d96c005ce152d62a6 Mon Sep 17 00:00:00 2001 +From: Colin Watson <cjwatson@ubuntu.com> +Date: Sat, 20 Nov 2010 17:57:22 +0100 +Subject: [PATCH] Retry opening console device on EIO + +As reported in https://launchpad.net/bugs/544139, ConsoleKit sometimes fails to +track the active VT. This particular case was tracked down to a race condition +that happens if you try to open /dev/console while the current TTY is currently +being closed. This yields an -EIO error, in which case CK should just try +again. + +For a more detailled summary of the problem from a kernel perspective, please +see https://bugs.launchpad.net/ubuntu/+source/linux/+bug/554172/comments/245 . + +Bug: https://bugs.freedesktop.org/show_bug.cgi?id=31790 +Bug-Ubuntu: https://launchpad.net/bugs/544139 +--- + src/ck-sysdeps-unix.c | 17 +++++++++++++++++ + 1 files changed, 17 insertions(+), 0 deletions(-) + +diff --git a/src/ck-sysdeps-unix.c b/src/ck-sysdeps-unix.c +index e4ab16b..4a1736c 100644 +--- a/src/ck-sysdeps-unix.c ++++ b/src/ck-sysdeps-unix.c +@@ -26,6 +26,7 @@ + #include <unistd.h> + #include <string.h> + #include <errno.h> ++#include <time.h> + #include <sys/types.h> + #include <sys/stat.h> + #include <sys/socket.h> +@@ -150,9 +151,25 @@ open_a_console (char *fnam) + { + int fd; + ++again: + fd = open (fnam, O_RDONLY | O_NOCTTY); + if (fd < 0 && errno == EACCES) + fd = open (fnam, O_WRONLY | O_NOCTTY); ++#ifdef __linux__ ++ if (fd < 0 && errno == EIO) { ++ /* Linux can return EIO if the tty is currently closing, ++ * which can happen if multiple processes are opening and ++ * closing the console in parallel. Unfortunately it can ++ * also return EIO in more serious situations too (see ++ * https://bugs.launchpad.net/bugs/554172), but there isn't ++ * much we can do about that since we really need a console ++ * fd. ++ */ ++ struct timespec ts = { 0, 100000000 }; /* 0.1 seconds */ ++ nanosleep (&ts, NULL); ++ goto again; ++ } ++#endif + + if (fd < 0) + return -1; +-- +1.7.2.3 + |