Commit e3e1804e authored by Joel Sing's avatar Joel Sing Committed by Andrew Gerrand

archive/tar: fix race in TestNonSeekable

Reimplement the test based on code from adg@golang.org.

The previous version has a race since the file is closed via defer
rather than in the go routine. This meant that the file could be
closed before the go routine has actually received io.EOF. It then
receives EBADF and continues to do zero-byte writes to the pipe.

This addresses an issue seen on FreeBSD and OpenBSD, where the test
passes but exits with a SIGPIPE, resulting in a failure.

R=golang-dev, adg
CC=golang-dev
https://golang.org/cl/5554083
parent dd442a55
......@@ -240,31 +240,20 @@ func TestNonSeekable(t *testing.T) {
}
defer f.Close()
// pipe the data in
r, w, err := os.Pipe()
if err != nil {
t.Fatalf("Unexpected error %s", err)
type readerOnly struct {
io.Reader
}
go func() {
rdbuf := make([]uint8, 1<<16)
for {
nr, err := f.Read(rdbuf)
w.Write(rdbuf[0:nr])
if err == io.EOF {
break
}
}
w.Close()
}()
tr := NewReader(r)
tr := NewReader(readerOnly{f})
nread := 0
for ; ; nread++ {
hdr, err := tr.Next()
if hdr == nil || err == io.EOF {
_, err := tr.Next()
if err == io.EOF {
break
}
if err != nil {
t.Fatalf("Unexpected error: %v", err)
}
}
if nread != len(test.headers) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment