aboutsummaryrefslogtreecommitdiff
path: root/libgo
diff options
context:
space:
mode:
authorIan Lance Taylor <ian@gcc.gnu.org>2013-12-28 18:00:30 +0000
committerIan Lance Taylor <ian@gcc.gnu.org>2013-12-28 18:00:30 +0000
commitf89b66f5ad705120584101c4d7a15532d0286e9e (patch)
treeedcb545da1741175776adf7bc27e61b808637602 /libgo
parent24879fd09218e5cdc8696f66a0de667285c08409 (diff)
downloadgcc-f89b66f5ad705120584101c4d7a15532d0286e9e.zip
gcc-f89b66f5ad705120584101c4d7a15532d0286e9e.tar.gz
gcc-f89b66f5ad705120584101c4d7a15532d0286e9e.tar.bz2
net: work around Solaris connect issue when server closes socket
On Solaris, if you do a in-progress connect, and then the server accepts and closes the socket, the client's later attempt to complete the connect will fail with EINVAL. Handle this case by assuming that the connect succeeded. This code is weird enough that it is implemented as Solaris-only so that it doesn't hide a real error on a different OS. See http://golang.org/issue/6828. From-SVN: r206232
Diffstat (limited to 'libgo')
-rw-r--r--libgo/go/net/fd_unix.go10
1 files changed, 10 insertions, 0 deletions
diff --git a/libgo/go/net/fd_unix.go b/libgo/go/net/fd_unix.go
index 4911ab0..a89303e 100644
--- a/libgo/go/net/fd_unix.go
+++ b/libgo/go/net/fd_unix.go
@@ -80,6 +80,16 @@ func (fd *netFD) connect(la, ra syscall.Sockaddr) error {
if err == nil || err == syscall.EISCONN {
break
}
+
+ // On Solaris we can see EINVAL if the socket has
+ // already been accepted and closed by the server.
+ // Treat this as a successful connection--writes to
+ // the socket will see EOF. For details and a test
+ // case in C see http://golang.org/issue/6828.
+ if runtime.GOOS == "solaris" && err == syscall.EINVAL {
+ break
+ }
+
if err != syscall.EINPROGRESS && err != syscall.EALREADY && err != syscall.EINTR {
return err
}