]> Cypherpunks repositories - gostls13.git/commitdiff
archive/tar: fix race in TestNonSeekable
authorJoel Sing <jsing@google.com>
Wed, 25 Jan 2012 02:44:53 +0000 (13:44 +1100)
committerAndrew Gerrand <adg@golang.org>
Wed, 25 Jan 2012 02:44:53 +0000 (13:44 +1100)
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

src/pkg/archive/tar/reader_test.go

index 0a6513d0cac01a8bf6cb8d9bef16db439e47b959..0a8646c393fdc3cc85bc9193a18d46f0aa1dc33b 100644 (file)
@@ -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) {