From 9f7fd893dc455339233a8e081f5fb5e2c51e7b5d Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Sat, 23 Sep 2017 22:00:53 -0700 Subject: [PATCH] os: don't refer directly to Sysfd in epipecheck MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 TryBot-Result: Gobot Gobot Reviewed-by: Daniel Martí Reviewed-by: David Crawshaw --- src/os/file_unix.go | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/os/file_unix.go b/src/os/file_unix.go index 8b600d80b9813..102cdfec50a8c 100644 --- a/src/os/file_unix.go +++ b/src/os/file_unix.go @@ -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() } }