]> git.ipfire.org Git - thirdparty/lxc.git/commitdiff
console: clean tty state + return 0 on peer exit
authorLiFeng <lifeng68@huawei.com>
Tue, 5 Sep 2017 15:16:50 +0000 (23:16 +0800)
committerChristian Brauner <christian.brauner@ubuntu.com>
Wed, 29 Nov 2017 11:52:21 +0000 (12:52 +0100)
In the past, if the console client exited, lxc_console_cb_con return 1. And
the lxc_poll will exit, the process will wait at waitpid. At this moment, the
process could not handle any command (For example get the container state
LXC_CMD_GET_STATE or stop the container LXC_CMD_STOP.).

I think we should clean the tty_state and return 0 in this case. So, we can use
the lxc-console to connect the console of the container. And we will not exit
the function lxc_polland we can handle the commands by lxc_cmd_process

Reproducer prior to this commit:
- open a new terminal, get the tty device name by command tty /dev/pts/6
- set lxc.console.path = /dev/pts/6
- start the container and the ouptut will print to /dev/pts/6
- close /dev/pts/6
- try an operation e.g. getting state with lxc-ls and lxc-ls will hang

Closes #1787.

Signed-off-by: LiFeng <lifeng68@huawei.com>
Acked-by: Christian Brauner <christian.brauner@ubuntu.com>
src/lxc/console.c

index dcbe02edd8bf070e5d734fef5c4700f5274b88bf..86bc4a95682480a1dcb8092a4443bf65bf62a192 100644 (file)
@@ -166,6 +166,15 @@ static int lxc_console_cb_con(int fd, uint32_t events, void *data,
        if (r <= 0) {
                INFO("console client on fd %d has exited", fd);
                lxc_mainloop_del_handler(descr, fd);
+               if (fd == console->peer) {
+                       if (console->tty_state) {
+                               lxc_console_sigwinch_fini(console->tty_state);
+                               console->tty_state = NULL;
+                       }
+                       console->peer = -1;
+                       close(fd);
+                       return 0;
+               }
                close(fd);
                return 1;
        }