Use different Ctty FDs based on the go version.

An upcoming change in Go 1.13 [1] changes the semantics of the SysProcAttr.Ctty
field. Prior to the change, the FD must be an FD in the child process's FD
table (aka "post-shuffle"). After the change, the FD must be an FD in the
current process's FD table (aka "pre-shuffle").

To be compatible with both versions this CL introduces a new boolean
"CttyFdIsPostShuffle" which indicates whether a pre- or post-shuffle FD should
be provided. We use build tags to chose the correct one.

1: https://go-review.googlesource.com/c/go/+/178919/
PiperOrigin-RevId: 255015303
This commit is contained in:
Nicolas Lacasse
2019-06-25 11:47:27 -07:00
committed by gVisor bot
parent 03ae91c662
commit a8f148b8e4
5 changed files with 72 additions and 5 deletions
+10
View File
@@ -237,6 +237,16 @@ func (ex *Exec) execChildAndWait(waitStatus *syscall.WaitStatus) subcommands.Exi
Setctty: true,
Ctty: int(tty.Fd()),
}
// TODO(b/133868570): Delete this check once Go 1.12 is no
// longer supported.
if console.CttyFdIsPostShuffle {
// In go1.12 and before, the Ctty FD must be the FD in
// the child process's FD table. Since we set
// cmd.Stdin/Stdout/Stderr to the tty FD, we can use
// any of 0, 1, or 2 here.
cmd.SysProcAttr.Ctty = 0
}
}
if err := cmd.Start(); err != nil {
+5 -1
View File
@@ -4,7 +4,11 @@ package(licenses = ["notice"])
go_library(
name = "console",
srcs = ["console.go"],
srcs = [
"console.go",
"ctty_1_12.go",
"ctty_1_13.go",
],
importpath = "gvisor.dev/gvisor/runsc/console",
visibility = [
"//runsc:__subpackages__",
+24
View File
@@ -0,0 +1,24 @@
// Copyright 2019 The gVisor Authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// +build go1.12
// +build !go1.13
// TODO(b/133868570): Delete once Go 1.12 is no longer supported.
package console
// CttyFdIsPostShuffle indicates that in go1.12 and earlier, the
// SysProcAttr.Ctty FD is determined "pre-shuffle" (not "post-shuffle").
var CttyFdIsPostShuffle = false
+24
View File
@@ -0,0 +1,24 @@
// Copyright 2019 The gVisor Authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// +build go1.13
// +build !go1.14
// TODO(b/133868570): Delete once Go 1.12 is no longer supported.
package console
// CttyFdIsPostShuffle indicates that in go1.13 and later, the SysProcAttr.Ctty
// FD is determined "post-shuffle".
var CttyFdIsPostShuffle = true
+9 -4
View File
@@ -437,11 +437,16 @@ func (s *Sandbox) createSandboxProcess(conf *boot.Config, args *Args, startSyncF
defer tty.Close()
// 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 are about to
// assign the TTY to nextFD, we can use that value here.
cmd.SysProcAttr.Setctty = true
cmd.SysProcAttr.Ctty = nextFD
cmd.SysProcAttr.Ctty = int(tty.Fd())
// TODO(b/133868570): Delete this check once Go 1.12 is no
// longer supported.
if console.CttyFdIsPostShuffle {
// In go1.12 and before, the Ctty FD must be the FD in
// the child process's FD table, which will be "nextFD"
// in this case.
cmd.SysProcAttr.Ctty = nextFD
}
// Pass the tty as all stdio fds to sandbox.
for i := 0; i < 3; i++ {