diff options
| author | Andrew Gerrand <adg@golang.org> | 2014-08-13 13:18:02 +1000 |
|---|---|---|
| committer | Andrew Gerrand <adg@golang.org> | 2014-08-13 13:18:02 +1000 |
| commit | 1657de2d6dbb020e15908668f209f3be7dcef151 (patch) | |
| tree | 62367a9618b6054f567e629f2a09492f0576e7d1 /src/pkg/net/sock_posix.go | |
| parent | f36546bc1078796716dcd8028f0d8210e366d80e (diff) | |
| download | go1.3.1.tar.xz | |
[release-branch.go1.3] net: prevent spurious on-connect events via epoll on linuxgo1.3.1
««« CL 120820043 / 06a4b59c1393
net: prevent spurious on-connect events via epoll on linux
On Linux, adding a socket descriptor to epoll instance before getting
the EINPROGRESS return value from connect system call could be a root
cause of spurious on-connect events.
See golang.org/issue/8276, golang.org/issue/8426 for further information.
All credit to Jason Eggleston <jason@eggnet.com>
Fixes #8276.
Fixes #8426.
LGTM=dvyukov
R=dvyukov, golang-codereviews, adg, dave, iant, alex.brainman
CC=golang-codereviews
https://golang.org/cl/120820043
»»»
TBR=r, rsc
CC=golang-codereviews
https://golang.org/cl/128110045
Diffstat (limited to 'src/pkg/net/sock_posix.go')
| -rw-r--r-- | src/pkg/net/sock_posix.go | 22 |
1 files changed, 8 insertions, 14 deletions
diff --git a/src/pkg/net/sock_posix.go b/src/pkg/net/sock_posix.go index a6ef874c9f..c80c7d6a2f 100644 --- a/src/pkg/net/sock_posix.go +++ b/src/pkg/net/sock_posix.go @@ -107,24 +107,18 @@ func (fd *netFD) dial(laddr, raddr sockaddr, deadline time.Time, toAddr func(sys } } } - if err := fd.init(); err != nil { - return err - } var rsa syscall.Sockaddr if raddr != nil { if rsa, err = raddr.sockaddr(fd.family); err != nil { return err - } else if rsa != nil { - if !deadline.IsZero() { - fd.setWriteDeadline(deadline) - } - if err := fd.connect(lsa, rsa); err != nil { - return err - } - fd.isConnected = true - if !deadline.IsZero() { - fd.setWriteDeadline(noDeadline) - } + } + if err := fd.connect(lsa, rsa, deadline); err != nil { + return err + } + fd.isConnected = true + } else { + if err := fd.init(); err != nil { + return err } } lsa, _ = syscall.Getsockname(fd.sysfd) |
