Skip to content

os/exec: data race in TestStdinClose #17647

@dvyukov

Description

@dvyukov

While testing new race runtime I've hit:

WARNING: DATA RACE
Read at 0x00c4200f8900 by goroutine 28:
  os.(*File).Write()
      /tmp/workdir/go/src/os/file.go:139 +0x70
  os.(*File).WriteString()
      /tmp/workdir/go/src/os/file.go:200 +0x7b
  os/exec.(*closeOnce).WriteString()
      <autogenerated>:43 +0x77
  io.WriteString()
      /tmp/workdir/go/src/io/io.go:289 +0xa5
  strings.(*Reader).WriteTo()
      /tmp/workdir/go/src/strings/reader.go:133 +0x172
  io.copyBuffer()
      /tmp/workdir/go/src/io/io.go:380 +0x432
  io.Copy()
      /tmp/workdir/go/src/io/io.go:360 +0x7e
  os/exec_test.TestStdinClose.func2()
      /tmp/workdir/go/src/os/exec/exec_test.go:241 +0xff

Previous write at 0x00c4200f8900 by goroutine 27:
  os.(*file).close()
      /tmp/workdir/go/src/os/file_unix.go:138 +0x10a
  os.(*File).Close()
      /tmp/workdir/go/src/os/file_unix.go:127 +0x55
  os/exec.(*closeOnce).close()
      /tmp/workdir/go/src/os/exec/exec.go:536 +0x50
  os/exec.(*closeOnce).(os/exec.close)-fm()
      /tmp/workdir/go/src/os/exec/exec.go:531 +0x41
  sync.(*Once).Do()
      /tmp/workdir/go/src/sync/once.go:44 +0xe1
  os/exec.(*closeOnce).Close()
      /tmp/workdir/go/src/os/exec/exec.go:531 +0x79
  os/exec.(*closeOnce).safeClose()
      /tmp/workdir/go/src/os/exec/exec.go:569 +0x55
  os/exec.(*closeOnce).(os/exec.safeClose)-fm()
      /tmp/workdir/go/src/os/exec/exec.go:518 +0x41
  os/exec.closerFunc.Close()
      /tmp/workdir/go/src/os/exec/exec.go:541 +0x34
  os/exec.(*Cmd).closeDescriptors()
      /tmp/workdir/go/src/os/exec/exec.go:262 +0x67
  os/exec.(*Cmd).Wait()
      /tmp/workdir/go/src/os/exec/exec.go:447 +0x2b8
  os/exec_test.TestStdinClose()
      /tmp/workdir/go/src/os/exec/exec_test.go:246 +0x21b
  testing.tRunner()
      /tmp/workdir/go/src/testing/testing.go:639 +0xcd

Goroutine 28 (running) created at:
  os/exec_test.TestStdinClose()
      /tmp/workdir/go/src/os/exec/exec_test.go:245 +0x20d
  testing.tRunner()
      /tmp/workdir/go/src/testing/testing.go:639 +0xcd

Goroutine 27 (running) created at:
  testing.(*T).Run()
      /tmp/workdir/go/src/testing/testing.go:676 +0x535
  testing.runTests.func1()
      /tmp/workdir/go/src/testing/testing.go:832 +0xaa
  testing.tRunner()
      /tmp/workdir/go/src/testing/testing.go:639 +0xcd
  testing.runTests()
      /tmp/workdir/go/src/testing/testing.go:838 +0x4a8
  testing.(*M).Run()
      /tmp/workdir/go/src/testing/testing.go:773 +0x12f
  main.main()
      os/exec/_test/_testmain.go:98 +0x1b8

I can't reproduce it with current race runtime, but the race looks very real. Introduced while fixing another race in os/exec #6270. One does not simply use os/exec without races.

Metadata

Metadata

Assignees

No one assigned

    Labels

    FrozenDueToAgeNeedsDecisionFeedback is required from experts, contributors, and/or the community before a change can be made.

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions