From c342872276d4a3d5f662684115e282cbb20bf227 Mon Sep 17 00:00:00 2001 From: Kir Kolyshkin Date: Fri, 5 Feb 2021 13:02:47 -0800 Subject: [PATCH] libct/config: fix a data race As reported by go test -race ./libcontainer/configs: === RUN TestCommandHookRunTimeout ================== WARNING: DATA RACE Read at 0x00c000202230 by goroutine 23: os/exec.(*Cmd).Wait() /usr/lib/golang/src/os/exec/exec.go:502 +0x91 github.com/opencontainers/runc/libcontainer/configs.Command.Run() /home/kir/go/src/github.com/opencontainers/runc/libcontainer/configs/config.go:390 +0x58c github.com/opencontainers/runc/libcontainer/configs_test.TestCommandHookRunTimeout() /home/kir/go/src/github.com/opencontainers/runc/libcontainer/configs/config_test.go:223 +0x3ed testing.tRunner() /usr/lib/golang/src/testing/testing.go:1123 +0x202 Previous write at 0x00c000202230 by goroutine 27: os/exec.(*Cmd).Wait() /usr/lib/golang/src/os/exec/exec.go:505 +0xb4 github.com/opencontainers/runc/libcontainer/configs.Command.Run.func1() /home/kir/go/src/github.com/opencontainers/runc/libcontainer/configs/config.go:373 +0x55 Goroutine 23 (running) created at: testing.(*T).Run() /usr/lib/golang/src/testing/testing.go:1168 +0x5bb testing.runTests.func1() /usr/lib/golang/src/testing/testing.go:1439 +0xa6 testing.tRunner() /usr/lib/golang/src/testing/testing.go:1123 +0x202 testing.runTests() /usr/lib/golang/src/testing/testing.go:1437 +0x612 testing.(*M).Run() /usr/lib/golang/src/testing/testing.go:1345 +0x3b3 main.main() _testmain.go:69 +0x236 Goroutine 27 (running) created at: github.com/opencontainers/runc/libcontainer/configs.Command.Run() /home/kir/go/src/github.com/opencontainers/runc/libcontainer/configs/config.go:372 +0x415 github.com/opencontainers/runc/libcontainer/configs_test.TestCommandHookRunTimeout() /home/kir/go/src/github.com/opencontainers/runc/libcontainer/configs/config_test.go:223 +0x3ed testing.tRunner() /usr/lib/golang/src/testing/testing.go:1123 +0x202 ================== testing.go:1038: race detected during execution of test --- FAIL: TestCommandHookRunTimeout (0.10s) Apparently, the issue is we call two Wait()s for the same command which can race internally. Fix is easy -- since we already have a waiting goroutine, wait for it to return instead of calling a second Wait(). Signed-off-by: Kir Kolyshkin --- libcontainer/configs/config.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libcontainer/configs/config.go b/libcontainer/configs/config.go index e1cd16265..3808f79a8 100644 --- a/libcontainer/configs/config.go +++ b/libcontainer/configs/config.go @@ -387,7 +387,7 @@ func (c Command) Run(s *specs.State) error { return err case <-timerCh: cmd.Process.Kill() - cmd.Wait() + <-errC return fmt.Errorf("hook ran past specified timeout of %.1fs", c.Timeout.Seconds()) } }