From 1939cd020f19a17707eb5e597e010fea8ab35de5 Mon Sep 17 00:00:00 2001 From: Nicolas Lacasse Date: Wed, 10 Oct 2018 14:33:59 -0700 Subject: runsc: Pass controlling TTY by FD in the *new* process, not current process. When setting Cmd.SysProcAttr.Ctty, the FD must be the FD of the controlling TTY in the new process, not the current process. The ioctl call is made after duping all FDs in Cmd.ExtraFiles, which may stomp on the old TTY FD. This fixes the "bad address" flakes in runsc/container:container_test, although some other flakes remain. PiperOrigin-RevId: 216594394 Change-Id: Idfd1677abb866aa82ad7e8be776f0c9087256862 --- runsc/sandbox/sandbox.go | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/runsc/sandbox/sandbox.go b/runsc/sandbox/sandbox.go index 26d725bdd..7f1afc34b 100644 --- a/runsc/sandbox/sandbox.go +++ b/runsc/sandbox/sandbox.go @@ -363,11 +363,6 @@ func (s *Sandbox) createSandboxProcess(spec *specs.Spec, conf *boot.Config, bund return fmt.Errorf("error setting up console with socket %q: %v", consoleSocket, err) } defer tty.Close() - fd := int(tty.Fd()) - - // Set the TTY as a controlling TTY on the sandbox process. - cmd.SysProcAttr.Setctty = true - cmd.SysProcAttr.Ctty = fd // Ideally we would set the sandbox stdin to this process' // stdin, but for some reason Docker does not like that (it @@ -378,6 +373,13 @@ func (s *Sandbox) createSandboxProcess(spec *specs.Spec, conf *boot.Config, bund cmd.Stdout = tty cmd.Stderr = tty + // Set the TTY as a controlling TTY on the sandbox process. + // Note that the Ctty field must be the FD of the TTY in the + // *new* process, not this process. Since we set the TTY to + // stdin, we can use FD 0 here. + cmd.SysProcAttr.Setctty = true + cmd.SysProcAttr.Ctty = 0 + // Pass the tty as all stdio fds to sandbox. for i := 0; i < 3; i++ { cmd.ExtraFiles = append(cmd.ExtraFiles, tty) -- cgit v1.2.3