Преглед изворни кода

Merge pull request #21018 from hqhq/hq_fix_race_exec_tty

Fix race condition when exec with tty
David Calavera пре 9 година
родитељ
комит
790d8f8520
2 измењених фајлова са 7 додато и 5 уклоњено
  1. 6 4
      daemon/execdriver/native/driver.go
  2. 1 1
      integration-cli/docker_cli_exec_unix_test.go

+ 6 - 4
daemon/execdriver/native/driver.go

@@ -441,12 +441,12 @@ type TtyConsole struct {
 }
 }
 
 
 // NewTtyConsole returns a new TtyConsole struct.
 // NewTtyConsole returns a new TtyConsole struct.
-func NewTtyConsole(console libcontainer.Console, pipes *execdriver.Pipes) (*TtyConsole, error) {
+func NewTtyConsole(console libcontainer.Console, pipes *execdriver.Pipes, wg *sync.WaitGroup) (*TtyConsole, error) {
 	tty := &TtyConsole{
 	tty := &TtyConsole{
 		console: console,
 		console: console,
 	}
 	}
 
 
-	if err := tty.AttachPipes(pipes); err != nil {
+	if err := tty.AttachPipes(pipes, wg); err != nil {
 		tty.Close()
 		tty.Close()
 		return nil, err
 		return nil, err
 	}
 	}
@@ -460,8 +460,10 @@ func (t *TtyConsole) Resize(h, w int) error {
 }
 }
 
 
 // AttachPipes attaches given pipes to TtyConsole
 // AttachPipes attaches given pipes to TtyConsole
-func (t *TtyConsole) AttachPipes(pipes *execdriver.Pipes) error {
+func (t *TtyConsole) AttachPipes(pipes *execdriver.Pipes, wg *sync.WaitGroup) error {
+	wg.Add(1)
 	go func() {
 	go func() {
+		defer wg.Done()
 		if wb, ok := pipes.Stdout.(interface {
 		if wb, ok := pipes.Stdout.(interface {
 			CloseWriters() error
 			CloseWriters() error
 		}); ok {
 		}); ok {
@@ -501,7 +503,7 @@ func setupPipes(container *configs.Config, processConfig *execdriver.ProcessConf
 		if err != nil {
 		if err != nil {
 			return writers, err
 			return writers, err
 		}
 		}
-		term, err := NewTtyConsole(cons, pipes)
+		term, err := NewTtyConsole(cons, pipes, wg)
 		if err != nil {
 		if err != nil {
 			return writers, err
 			return writers, err
 		}
 		}

+ 1 - 1
integration-cli/docker_cli_exec_unix_test.go

@@ -49,7 +49,7 @@ func (s *DockerSuite) TestExecTTY(c *check.C) {
 	c.Assert(err, checker.IsNil)
 	c.Assert(err, checker.IsNil)
 	defer p.Close()
 	defer p.Close()
 
 
-	_, err = p.Write([]byte("cat /foo && sleep 2 && exit\n"))
+	_, err = p.Write([]byte("cat /foo && exit\n"))
 	c.Assert(err, checker.IsNil)
 	c.Assert(err, checker.IsNil)
 
 
 	chErr := make(chan error)
 	chErr := make(chan error)