From: Joel Sing Date: Wed, 25 Jan 2012 02:44:53 +0000 (+1100) Subject: archive/tar: fix race in TestNonSeekable X-Git-Tag: weekly.2012-01-27~57 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=e3e1804ed2af1163335369300cfc562c35ffa4c9;p=gostls13.git 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 --- diff --git a/src/pkg/archive/tar/reader_test.go b/src/pkg/archive/tar/reader_test.go index 0a6513d0ca..0a8646c393 100644 --- a/src/pkg/archive/tar/reader_test.go +++ b/src/pkg/archive/tar/reader_test.go @@ -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) {