summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaweł Gronowski <pawel.gronowski@docker.com>2023-03-15 16:39:08 +0100
committerPaweł Gronowski <pawel.gronowski@docker.com>2023-03-20 16:16:44 +0100
commit88992de28303364f4ad4301dd60855a190520b54 (patch)
treee565c6fc4582d45012297eebdea03c5586cbba8c
parentfed1c96e10fc246076db43465d0f5a8b9d93d42d (diff)
downloaddocker-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.go20
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