mirror of
https://github.com/golang/go
synced 2024-11-13 18:40:22 -07:00
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
This commit is contained in:
parent
dd442a556e
commit
e3e1804ed2
@ -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) {
|
||||
|
Loading…
Reference in New Issue
Block a user