]> git.ipfire.org Git - thirdparty/lxc.git/commitdiff
lxc_setup_tios(): Ignore SIGTTOU and SIGTTIN signals 1386/head
authorThomas Jarosch <thomas.jarosch@intra2net.com>
Thu, 2 Feb 2017 11:48:35 +0000 (12:48 +0100)
committerChristian Brauner <christian.brauner@ubuntu.com>
Tue, 4 Apr 2017 14:53:04 +0000 (16:53 +0200)
Prevent an endless loop while executing lxc-attach in the background:

The kernel might fire SIGTTOU while an ioctl() in tcsetattr()
is executed. When the ioctl() is resumed and retries,
the signal handler interrupts it again.

We can't configure the TTY to stop sending
the signals in the first place since that
is a modification/write to the TTY already.

Still we clear the TOSTOP flag to prevent further signals.

Command to reproduce the hang:
----------------------------
cat > lxc_hang.sh << EOF
/usr/bin/timeout 5s /usr/bin/lxc-attach -n SOMECONTAINER -- /bin/true
EOF
sh lxc_hang.sh    # hangs
----------------------------

Signed-off-by: Thomas Jarosch <thomas.jarosch@intra2net.com>
src/lxc/console.c

index 908ead0af134342db4be2f0632f6baebb3bc79bb..0cfc9ab84e41777ade1615bcb8a154748c955551 100644 (file)
@@ -257,6 +257,14 @@ int lxc_setup_tios(int fd, struct termios *oldtios)
                return -1;
        }
 
+       /* ensure we don't end up in an endless loop:
+        * The kernel might fire SIGTTOU while an
+        * ioctl() in tcsetattr() is executed. When the ioctl()
+        * is resumed and retries, the signal handler interrupts it again.
+        */
+       signal (SIGTTIN, SIG_IGN);
+       signal (SIGTTOU, SIG_IGN);
+
        newtios = *oldtios;
 
        /* We use the same settings that ssh does. */
@@ -265,7 +273,7 @@ int lxc_setup_tios(int fd, struct termios *oldtios)
 #ifdef IUCLC
        newtios.c_iflag &= ~IUCLC;
 #endif
-       newtios.c_lflag &= ~(ISIG | ICANON | ECHO | ECHOE | ECHOK | ECHONL);
+       newtios.c_lflag &= ~(TOSTOP | ISIG | ICANON | ECHO | ECHOE | ECHOK | ECHONL);
 #ifdef IEXTEN
        newtios.c_lflag &= ~IEXTEN;
 #endif