diff --git a/contrib/cmd/recvtty/recvtty.go b/contrib/cmd/recvtty/recvtty.go index 8fddd0269..cf2fddf76 100644 --- a/contrib/cmd/recvtty/recvtty.go +++ b/contrib/cmd/recvtty/recvtty.go @@ -106,6 +106,9 @@ func handleSingle(path string, noStdin bool) error { if err != nil { return err } + if err := console.ClearONLCR(c.Fd()); err != nil { + return err + } // Copy from our stdio to the master fd. var ( diff --git a/libcontainer/init_linux.go b/libcontainer/init_linux.go index c078556c4..70cde7a92 100644 --- a/libcontainer/init_linux.go +++ b/libcontainer/init_linux.go @@ -186,10 +186,6 @@ func setupConsole(socket *os.File, config *initConfig, mount bool) error { if err != nil { return err } - err = console.ClearONLCR(pty.Fd()) - if err != nil { - return err - } // After we return from here, we don't need the console anymore. defer pty.Close() diff --git a/libcontainer/integration/execin_test.go b/libcontainer/integration/execin_test.go index dda716712..6bdf968db 100644 --- a/libcontainer/integration/execin_test.go +++ b/libcontainer/integration/execin_test.go @@ -313,6 +313,11 @@ func TestExecInTTY(t *testing.T) { done <- fmt.Errorf("ConsoleFromFile: %w", err) return } + err = console.ClearONLCR(c.Fd()) + if err != nil { + done <- fmt.Errorf("ClearONLCR: %w", err) + return + } // An error from io.Copy is expected once the terminal // is gone, so we deliberately ignore it. _, _ = io.Copy(&stdout, c) diff --git a/tty.go b/tty.go index b15010202..844d7f842 100644 --- a/tty.go +++ b/tty.go @@ -112,6 +112,10 @@ func (t *tty) recvtty(process *libcontainer.Process, socket *os.File) (Err error if err != nil { return err } + err = console.ClearONLCR(cons.Fd()) + if err != nil { + return err + } epoller, err := console.NewEpoller() if err != nil { return err