Always set SysProcAttr.Ctty to an FD in the child's FD table.
Go was going to change the behavior of SysProcAttr.Ctty such that it must be an FD in the *parent* FD table: https://go-review.googlesource.com/c/go/+/178919/ However, after some debate, it was decided that this change was too backwards-incompatible, and so it was reverted. https://github.com/golang/go/issues/29458 The behavior going forward is unchanged: the Ctty FD must be an FD in the *child* FD table. PiperOrigin-RevId: 255228476
This commit is contained in:
parent
e98ce4a2c6
commit
67e2f227aa
|
@ -235,18 +235,12 @@ func (ex *Exec) execChildAndWait(waitStatus *syscall.WaitStatus) subcommands.Exi
|
|||
cmd.SysProcAttr = &syscall.SysProcAttr{
|
||||
Setsid: true,
|
||||
Setctty: true,
|
||||
Ctty: int(tty.Fd()),
|
||||
// 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.
|
||||
// See https://github.com/golang/go/issues/29458.
|
||||
Ctty: 0,
|
||||
}
|
||||
// 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 {
|
||||
|
|
|
@ -6,8 +6,6 @@ go_library(
|
|||
name = "console",
|
||||
srcs = [
|
||||
"console.go",
|
||||
"ctty_1_12.go",
|
||||
"ctty_1_13.go",
|
||||
],
|
||||
importpath = "gvisor.dev/gvisor/runsc/console",
|
||||
visibility = [
|
||||
|
|
|
@ -1,24 +0,0 @@
|
|||
// 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
|
|
@ -1,24 +0,0 @@
|
|||
// 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
|
|
@ -438,15 +438,10 @@ func (s *Sandbox) createSandboxProcess(conf *boot.Config, args *Args, startSyncF
|
|||
|
||||
// Set the TTY as a controlling TTY on the sandbox process.
|
||||
cmd.SysProcAttr.Setctty = true
|
||||
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
|
||||
}
|
||||
// The Ctty FD must be the FD in the child process's FD table,
|
||||
// which will be nextFD in this case.
|
||||
// See https://github.com/golang/go/issues/29458.
|
||||
cmd.SysProcAttr.Ctty = nextFD
|
||||
|
||||
// Pass the tty as all stdio fds to sandbox.
|
||||
for i := 0; i < 3; i++ {
|
||||
|
|
Loading…
Reference in New Issue