From b7744547368ba758fc2947e423cb812c69537492 Mon Sep 17 00:00:00 2001 From: Kir Kolyshkin Date: Mon, 8 Feb 2021 15:33:24 -0800 Subject: [PATCH] libct/int: fix a data race Fix for the following: $ sudo go test -race -v ./libcontainer/integration/ === RUN TestUsernsCheckpoint ================== WARNING: DATA RACE Write at 0x00c00019e650 by goroutine 15: bytes.(*Buffer).ReadFrom() /usr/lib/golang/src/bytes/buffer.go:200 +0x48 io.copyBuffer() /usr/lib/golang/src/io/io.go:395 +0x3fe io.Copy() /usr/lib/golang/src/io/io.go:368 +0x7a os/exec.(*Cmd).writerDescriptor.func1() /usr/lib/golang/src/os/exec/exec.go:311 +0x4a os/exec.(*Cmd).Start.func1() /usr/lib/golang/src/os/exec/exec.go:441 +0x38 Previous write at 0x00c00019e650 by goroutine 12: bytes.(*Buffer).ReadFrom() /usr/lib/golang/src/bytes/buffer.go:200 +0x48 io.copyBuffer() /usr/lib/golang/src/io/io.go:395 +0x3fe io.Copy() /usr/lib/golang/src/io/io.go:368 +0x7a os/exec.(*Cmd).writerDescriptor.func1() /usr/lib/golang/src/os/exec/exec.go:311 +0x4a os/exec.(*Cmd).Start.func1() /usr/lib/golang/src/os/exec/exec.go:441 +0x38 Goroutine 15 (running) created at: os/exec.(*Cmd).Start() /usr/lib/golang/src/os/exec/exec.go:440 +0xaaa github.com/opencontainers/runc/libcontainer.(*linuxContainer).criuSwrk() /home/kir/go/src/github.com/opencontainers/runc/libcontainer/container_linux.go:1490 +0x5f7 github.com/opencontainers/runc/libcontainer.(*linuxContainer).Restore() /home/kir/go/src/github.com/opencontainers/runc/libcontainer/container_linux.go:1398 +0x29ef github.com/opencontainers/runc/libcontainer/integration.testCheckpoint() /home/kir/go/src/github.com/opencontainers/runc/libcontainer/integration/checkpoint_test.go:204 +0x1898 github.com/opencontainers/runc/libcontainer/integration.TestUsernsCheckpoint() /home/kir/go/src/github.com/opencontainers/runc/libcontainer/integration/checkpoint_test.go:48 +0x177 testing.tRunner() /usr/lib/golang/src/testing/testing.go:1123 +0x202 Goroutine 12 (finished) created at: os/exec.(*Cmd).Start() /usr/lib/golang/src/os/exec/exec.go:440 +0xaaa github.com/opencontainers/runc/libcontainer.(*initProcess).start() /home/kir/go/src/github.com/opencontainers/runc/libcontainer/process_linux.go:313 +0xda github.com/opencontainers/runc/libcontainer.(*linuxContainer).start() /home/kir/go/src/github.com/opencontainers/runc/libcontainer/container_linux.go:366 +0xb0 github.com/opencontainers/runc/libcontainer.(*linuxContainer).Start() /home/kir/go/src/github.com/opencontainers/runc/libcontainer/container_linux.go:263 +0x27b github.com/opencontainers/runc/libcontainer.(*linuxContainer).Run() /home/kir/go/src/github.com/opencontainers/runc/libcontainer/container_linux.go:273 +0x46 github.com/opencontainers/runc/libcontainer/integration.testCheckpoint() /home/kir/go/src/github.com/opencontainers/runc/libcontainer/integration/checkpoint_test.go:108 +0x941 github.com/opencontainers/runc/libcontainer/integration.TestUsernsCheckpoint() /home/kir/go/src/github.com/opencontainers/runc/libcontainer/integration/checkpoint_test.go:48 +0x177 testing.tRunner() /usr/lib/golang/src/testing/testing.go:1123 +0x202 ================== ================== WARNING: DATA RACE Read at 0x00c00019e630 by goroutine 15: bytes.(*Buffer).Len() /usr/lib/golang/src/bytes/buffer.go:73 +0x58 bytes.(*Buffer).grow() /usr/lib/golang/src/bytes/buffer.go:118 +0x4f bytes.(*Buffer).ReadFrom() /usr/lib/golang/src/bytes/buffer.go:202 +0x7c io.copyBuffer() /usr/lib/golang/src/io/io.go:395 +0x3fe io.Copy() /usr/lib/golang/src/io/io.go:368 +0x7a os/exec.(*Cmd).writerDescriptor.func1() /usr/lib/golang/src/os/exec/exec.go:311 +0x4a os/exec.(*Cmd).Start.func1() /usr/lib/golang/src/os/exec/exec.go:441 +0x38 Previous write at 0x00c00019e630 by goroutine 12: bytes.(*Buffer).ReadFrom() /usr/lib/golang/src/bytes/buffer.go:209 +0x1c4 io.copyBuffer() /usr/lib/golang/src/io/io.go:395 +0x3fe io.Copy() /usr/lib/golang/src/io/io.go:368 +0x7a os/exec.(*Cmd).writerDescriptor.func1() /usr/lib/golang/src/os/exec/exec.go:311 +0x4a os/exec.(*Cmd).Start.func1() /usr/lib/golang/src/os/exec/exec.go:441 +0x38 Goroutine 15 (running) created at: os/exec.(*Cmd).Start() /usr/lib/golang/src/os/exec/exec.go:440 +0xaaa github.com/opencontainers/runc/libcontainer.(*linuxContainer).criuSwrk() /home/kir/go/src/github.com/opencontainers/runc/libcontainer/container_linux.go:1490 +0x5f7 github.com/opencontainers/runc/libcontainer.(*linuxContainer).Restore() /home/kir/go/src/github.com/opencontainers/runc/libcontainer/container_linux.go:1398 +0x29ef github.com/opencontainers/runc/libcontainer/integration.testCheckpoint() /home/kir/go/src/github.com/opencontainers/runc/libcontainer/integration/checkpoint_test.go:204 +0x1898 github.com/opencontainers/runc/libcontainer/integration.TestUsernsCheckpoint() /home/kir/go/src/github.com/opencontainers/runc/libcontainer/integration/checkpoint_test.go:48 +0x177 testing.tRunner() /usr/lib/golang/src/testing/testing.go:1123 +0x202 Goroutine 12 (finished) created at: os/exec.(*Cmd).Start() /usr/lib/golang/src/os/exec/exec.go:440 +0xaaa github.com/opencontainers/runc/libcontainer.(*initProcess).start() /home/kir/go/src/github.com/opencontainers/runc/libcontainer/process_linux.go:313 +0xda github.com/opencontainers/runc/libcontainer.(*linuxContainer).start() /home/kir/go/src/github.com/opencontainers/runc/libcontainer/container_linux.go:366 +0xb0 github.com/opencontainers/runc/libcontainer.(*linuxContainer).Start() /home/kir/go/src/github.com/opencontainers/runc/libcontainer/container_linux.go:263 +0x27b github.com/opencontainers/runc/libcontainer.(*linuxContainer).Run() /home/kir/go/src/github.com/opencontainers/runc/libcontainer/container_linux.go:273 +0x46 github.com/opencontainers/runc/libcontainer/integration.testCheckpoint() /home/kir/go/src/github.com/opencontainers/runc/libcontainer/integration/checkpoint_test.go:108 +0x941 github.com/opencontainers/runc/libcontainer/integration.TestUsernsCheckpoint() /home/kir/go/src/github.com/opencontainers/runc/libcontainer/integration/checkpoint_test.go:48 +0x177 testing.tRunner() /usr/lib/golang/src/testing/testing.go:1123 +0x202 ================== ================== WARNING: DATA RACE Read at 0x00c00019e648 by goroutine 15: bytes.(*Buffer).Len() /usr/lib/golang/src/bytes/buffer.go:73 +0x7e bytes.(*Buffer).grow() /usr/lib/golang/src/bytes/buffer.go:118 +0x4f bytes.(*Buffer).ReadFrom() /usr/lib/golang/src/bytes/buffer.go:202 +0x7c io.copyBuffer() /usr/lib/golang/src/io/io.go:395 +0x3fe io.Copy() /usr/lib/golang/src/io/io.go:368 +0x7a os/exec.(*Cmd).writerDescriptor.func1() /usr/lib/golang/src/os/exec/exec.go:311 +0x4a os/exec.(*Cmd).Start.func1() /usr/lib/golang/src/os/exec/exec.go:441 +0x38 Previous write at 0x00c00019e648 by goroutine 12: bytes.(*Buffer).grow() /usr/lib/golang/src/bytes/buffer.go:147 +0x2d7 bytes.(*Buffer).ReadFrom() /usr/lib/golang/src/bytes/buffer.go:202 +0x7c io.copyBuffer() /usr/lib/golang/src/io/io.go:395 +0x3fe io.Copy() /usr/lib/golang/src/io/io.go:368 +0x7a os/exec.(*Cmd).writerDescriptor.func1() /usr/lib/golang/src/os/exec/exec.go:311 +0x4a os/exec.(*Cmd).Start.func1() /usr/lib/golang/src/os/exec/exec.go:441 +0x38 Goroutine 15 (running) created at: os/exec.(*Cmd).Start() /usr/lib/golang/src/os/exec/exec.go:440 +0xaaa github.com/opencontainers/runc/libcontainer.(*linuxContainer).criuSwrk() /home/kir/go/src/github.com/opencontainers/runc/libcontainer/container_linux.go:1490 +0x5f7 github.com/opencontainers/runc/libcontainer.(*linuxContainer).Restore() /home/kir/go/src/github.com/opencontainers/runc/libcontainer/container_linux.go:1398 +0x29ef github.com/opencontainers/runc/libcontainer/integration.testCheckpoint() /home/kir/go/src/github.com/opencontainers/runc/libcontainer/integration/checkpoint_test.go:204 +0x1898 github.com/opencontainers/runc/libcontainer/integration.TestUsernsCheckpoint() /home/kir/go/src/github.com/opencontainers/runc/libcontainer/integration/checkpoint_test.go:48 +0x177 testing.tRunner() /usr/lib/golang/src/testing/testing.go:1123 +0x202 Goroutine 12 (finished) created at: os/exec.(*Cmd).Start() /usr/lib/golang/src/os/exec/exec.go:440 +0xaaa github.com/opencontainers/runc/libcontainer.(*initProcess).start() /home/kir/go/src/github.com/opencontainers/runc/libcontainer/process_linux.go:313 +0xda github.com/opencontainers/runc/libcontainer.(*linuxContainer).start() /home/kir/go/src/github.com/opencontainers/runc/libcontainer/container_linux.go:366 +0xb0 github.com/opencontainers/runc/libcontainer.(*linuxContainer).Start() /home/kir/go/src/github.com/opencontainers/runc/libcontainer/container_linux.go:263 +0x27b github.com/opencontainers/runc/libcontainer.(*linuxContainer).Run() /home/kir/go/src/github.com/opencontainers/runc/libcontainer/container_linux.go:273 +0x46 github.com/opencontainers/runc/libcontainer/integration.testCheckpoint() /home/kir/go/src/github.com/opencontainers/runc/libcontainer/integration/checkpoint_test.go:108 +0x941 github.com/opencontainers/runc/libcontainer/integration.TestUsernsCheckpoint() /home/kir/go/src/github.com/opencontainers/runc/libcontainer/integration/checkpoint_test.go:48 +0x177 testing.tRunner() /usr/lib/golang/src/testing/testing.go:1123 +0x202 ================== testing.go:1038: race detected during execution of test --- FAIL: TestUsernsCheckpoint (0.62s) Signed-off-by: Kir Kolyshkin --- libcontainer/integration/checkpoint_test.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/libcontainer/integration/checkpoint_test.go b/libcontainer/integration/checkpoint_test.go index 627a013f2..cecf0b547 100644 --- a/libcontainer/integration/checkpoint_test.go +++ b/libcontainer/integration/checkpoint_test.go @@ -194,10 +194,11 @@ func testCheckpoint(t *testing.T, userns bool) { t.Fatal(err) } + var restoreStdout bytes.Buffer restoreProcessConfig := &libcontainer.Process{ Cwd: "/", Stdin: restoreStdinR, - Stdout: &stdout, + Stdout: &restoreStdout, Init: true, } @@ -242,7 +243,7 @@ func testCheckpoint(t *testing.T, userns bool) { t.Fatal(s.String(), pid) } - output := stdout.String() + output := restoreStdout.String() if !strings.Contains(output, "Hello!") { t.Fatal("Did not restore the pipe correctly:", output) }