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/fd_windows.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/fd_windows.go')
| -rw-r--r-- | src/pkg/net/fd_windows.go | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/src/pkg/net/fd_windows.go b/src/pkg/net/fd_windows.go index a1f6bc5f81..d1129dccc4 100644 --- a/src/pkg/net/fd_windows.go +++ b/src/pkg/net/fd_windows.go @@ -313,10 +313,17 @@ func (fd *netFD) setAddr(laddr, raddr Addr) { runtime.SetFinalizer(fd, (*netFD).Close) } -func (fd *netFD) connect(la, ra syscall.Sockaddr) error { +func (fd *netFD) connect(la, ra syscall.Sockaddr, deadline time.Time) error { // Do not need to call fd.writeLock here, // because fd is not yet accessible to user, // so no concurrent operations are possible. + if err := fd.init(); err != nil { + return err + } + if !deadline.IsZero() { + fd.setWriteDeadline(deadline) + defer fd.setWriteDeadline(noDeadline) + } if !canUseConnectEx(fd.net) { return syscall.Connect(fd.sysfd, ra) } |
