From 5de99cd3905068da9a597d1de6b155448e53fde4 Mon Sep 17 00:00:00 2001 From: Aleksa Sarai Date: Fri, 21 Sep 2018 11:55:36 +1000 Subject: [PATCH] tty: clean up epollConsole closing ec0d23a92ffe ("tty: close epollConsole on errors") fixed a significant issue, but the cleanup was not ideal (especially if the function is changed in future to add additional error conditions to those currently present). Using the defer-named-error trick avoids this issue and makes the code more readable. Signed-off-by: Aleksa Sarai --- tty.go | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/tty.go b/tty.go index 70ebc6bdc..6106c2db3 100644 --- a/tty.go +++ b/tty.go @@ -71,7 +71,7 @@ func inheritStdio(process *libcontainer.Process) error { return nil } -func (t *tty) recvtty(process *libcontainer.Process, socket *os.File) error { +func (t *tty) recvtty(process *libcontainer.Process, socket *os.File) (Err error) { f, err := utils.RecvFd(socket) if err != nil { return err @@ -89,6 +89,11 @@ func (t *tty) recvtty(process *libcontainer.Process, socket *os.File) error { if err != nil { return err } + defer func() { + if Err != nil { + epollConsole.Close() + } + }() go epoller.Wait() go io.Copy(epollConsole, os.Stdin) t.wg.Add(1) @@ -97,11 +102,9 @@ func (t *tty) recvtty(process *libcontainer.Process, socket *os.File) error { // set raw mode to stdin and also handle interrupt stdin, err := console.ConsoleFromFile(os.Stdin) if err != nil { - epollConsole.Close() return err } if err := stdin.SetRaw(); err != nil { - epollConsole.Close() return fmt.Errorf("failed to set the terminal from the stdin: %v", err) } go handleInterrupt(stdin)