diff options
author | Paweł Gronowski <pawel.gronowski@docker.com> | 2023-03-15 16:39:08 +0100 |
---|---|---|
committer | Paweł Gronowski <pawel.gronowski@docker.com> | 2023-03-20 16:16:44 +0100 |
commit | 88992de28303364f4ad4301dd60855a190520b54 (patch) | |
tree | e565c6fc4582d45012297eebdea03c5586cbba8c | |
parent | fed1c96e10fc246076db43465d0f5a8b9d93d42d (diff) | |
download | docker-88992de28303364f4ad4301dd60855a190520b54.tar.gz |
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>
-rw-r--r-- | testutil/daemon/daemon.go | 20 |
1 files changed, 10 insertions, 10 deletions
diff --git a/testutil/daemon/daemon.go b/testutil/daemon/daemon.go index a78c138786..2a1f5b3dc8 100644 --- a/testutil/daemon/daemon.go +++ b/testutil/daemon/daemon.go @@ -392,25 +392,27 @@ 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.Env = append(d.cmd.Env, d.extraEnv...) - 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.Env = append(cmd.Env, d.extraEnv...) + 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. @@ -418,8 +420,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 |