]> Cypherpunks repositories - gostls13.git/commitdiff
os: don't refer directly to Sysfd in epipecheck
authorIan Lance Taylor <iant@golang.org>
Sun, 24 Sep 2017 05:00:53 +0000 (22:00 -0700)
committerIan Lance Taylor <iant@golang.org>
Sun, 24 Sep 2017 14:25:50 +0000 (14:25 +0000)
Instead record in the File whether it is stdout/stderr. This avoids a
race between a call to epipecheck and closing the file.

Fixes #21994

Change-Id: Ic3d552ffa83402136276bcb5029ec3e6691042c2
Reviewed-on: https://go-review.googlesource.com/65750
Run-TryBot: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Daniel Martí <mvdan@mvdan.cc>
Reviewed-by: David Crawshaw <crawshaw@golang.org>
src/os/file_unix.go

index 8b600d80b9813ac0d0df34c8ae25f5a28f22a27e..102cdfec50a8c3067ee5c7b54f8962758a22e208 100644 (file)
@@ -45,10 +45,11 @@ func rename(oldname, newname string) error {
 // can overwrite this data, which could cause the finalizer
 // to close the wrong file descriptor.
 type file struct {
-       pfd      poll.FD
-       name     string
-       dirinfo  *dirInfo // nil unless directory being read
-       nonblock bool     // whether we set nonblocking mode
+       pfd         poll.FD
+       name        string
+       dirinfo     *dirInfo // nil unless directory being read
+       nonblock    bool     // whether we set nonblocking mode
+       stdoutOrErr bool     // whether this is stdout or stderr
 }
 
 // Fd returns the integer Unix file descriptor referencing the open file.
@@ -90,7 +91,8 @@ func newFile(fd uintptr, name string, pollable bool) *File {
                        IsStream:      true,
                        ZeroReadIsEOF: true,
                },
-               name: name,
+               name:        name,
+               stdoutOrErr: fdi == 1 || fdi == 2,
        }}
 
        // Don't try to use kqueue with regular files on FreeBSD.
@@ -130,7 +132,7 @@ type dirInfo struct {
 // output or standard error. See the SIGPIPE docs in os/signal, and
 // issue 11845.
 func epipecheck(file *File, e error) {
-       if e == syscall.EPIPE && (file.pfd.Sysfd == 1 || file.pfd.Sysfd == 2) {
+       if e == syscall.EPIPE && file.stdoutOrErr {
                sigpipe()
        }
 }