Selaa lähdekoodia

StartWithLogFile: Fix d.cmd race

Use `exec.Command` created by this function instead of obtaining it from
daemon struct. This prevents a race condition where `daemon.Kill` is
called before the goroutine has the chance to call `cmd.Wait`.

Signed-off-by: Paweł Gronowski <pawel.gronowski@docker.com>
(cherry picked from commit 88992de28303364f4ad4301dd60855a190520b54)
Signed-off-by: Paweł Gronowski <pawel.gronowski@docker.com>
Paweł Gronowski 2 vuotta sitten
vanhempi
commit
e55d9b155d
1 muutettua tiedostoa jossa 9 lisäystä ja 9 poistoa
  1. 9 9
      testutil/daemon/daemon.go

+ 9 - 9
testutil/daemon/daemon.go

@@ -380,24 +380,26 @@ func (d *Daemon) StartWithLogFile(out *os.File, providedArgs ...string) error {
 	}
 
 	d.args = append(d.args, providedArgs...)
-	d.cmd = exec.Command(dockerdBinary, d.args...)
-	d.cmd.Env = append(os.Environ(), "DOCKER_SERVICE_PREFER_OFFLINE_IMAGE=1")
-	d.cmd.Stdout = out
-	d.cmd.Stderr = out
+	cmd := exec.Command(dockerdBinary, d.args...)
+	cmd.Env = append(os.Environ(), "DOCKER_SERVICE_PREFER_OFFLINE_IMAGE=1")
+	cmd.Stdout = out
+	cmd.Stderr = out
 	d.logFile = out
 	if d.rootlessUser != nil {
 		// sudo requires this for propagating signals
-		setsid(d.cmd)
+		setsid(cmd)
 	}
 
-	if err := d.cmd.Start(); err != nil {
+	if err := cmd.Start(); err != nil {
 		return errors.Wrapf(err, "[%s] could not start daemon container", d.id)
 	}
 
 	wait := make(chan error, 1)
+	d.cmd = cmd
+	d.Wait = wait
 
 	go func() {
-		ret := d.cmd.Wait()
+		ret := cmd.Wait()
 		d.log.Logf("[%s] exiting daemon", d.id)
 		// If we send before logging, we might accidentally log _after_ the test is done.
 		// As of Go 1.12, this incurs a panic instead of silently being dropped.
@@ -405,8 +407,6 @@ func (d *Daemon) StartWithLogFile(out *os.File, providedArgs ...string) error {
 		close(wait)
 	}()
 
-	d.Wait = wait
-
 	clientConfig, err := d.getClientConfig()
 	if err != nil {
 		return err