Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings
/goPublic

Commit1657de2

Browse files
committed
[release-branch.go1.3] net: prevent spurious on-connect events via epoll on linux
««« CL 120820043 / 06a4b59c1393net: prevent spurious on-connect events via epoll on linuxOn Linux, adding a socket descriptor to epoll instance before gettingthe EINPROGRESS return value from connect system call could be a rootcause 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=dvyukovR=dvyukov, golang-codereviews, adg, dave, iant, alex.brainmanCC=golang-codereviewshttps://golang.org/cl/120820043»»»TBR=r, rscCC=golang-codereviewshttps://golang.org/cl/128110045
1 parentf36546b commit1657de2

File tree

3 files changed

+30
-19
lines changed

3 files changed

+30
-19
lines changed

‎src/pkg/net/fd_unix.go‎

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -68,16 +68,19 @@ func (fd *netFD) name() string {
6868
returnfd.net+":"+ls+"->"+rs
6969
}
7070

71-
func (fd*netFD)connect(la,ra syscall.Sockaddr)error {
71+
func (fd*netFD)connect(la,ra syscall.Sockaddr,deadline time.Time)error {
7272
// Do not need to call fd.writeLock here,
7373
// because fd is not yet accessible to user,
7474
// so no concurrent operations are possible.
75-
iferr:=fd.pd.PrepareWrite();err!=nil {
76-
returnerr
77-
}
7875
switcherr:=syscall.Connect(fd.sysfd,ra);err {
7976
casesyscall.EINPROGRESS,syscall.EALREADY,syscall.EINTR:
8077
casenil,syscall.EISCONN:
78+
if!deadline.IsZero()&&deadline.Before(time.Now()) {
79+
returnerrTimeout
80+
}
81+
iferr:=fd.init();err!=nil {
82+
returnerr
83+
}
8184
returnnil
8285
casesyscall.EINVAL:
8386
// On Solaris we can see EINVAL if the socket has
@@ -92,6 +95,13 @@ func (fd *netFD) connect(la, ra syscall.Sockaddr) error {
9295
default:
9396
returnerr
9497
}
98+
iferr:=fd.init();err!=nil {
99+
returnerr
100+
}
101+
if!deadline.IsZero() {
102+
fd.setWriteDeadline(deadline)
103+
deferfd.setWriteDeadline(noDeadline)
104+
}
95105
for {
96106
// Performing multiple connect system calls on a
97107
// non-blocking socket under Unix variants does not

‎src/pkg/net/fd_windows.go‎

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -313,10 +313,17 @@ func (fd *netFD) setAddr(laddr, raddr Addr) {
313313
runtime.SetFinalizer(fd, (*netFD).Close)
314314
}
315315

316-
func (fd*netFD)connect(la,ra syscall.Sockaddr)error {
316+
func (fd*netFD)connect(la,ra syscall.Sockaddr,deadline time.Time)error {
317317
// Do not need to call fd.writeLock here,
318318
// because fd is not yet accessible to user,
319319
// so no concurrent operations are possible.
320+
iferr:=fd.init();err!=nil {
321+
returnerr
322+
}
323+
if!deadline.IsZero() {
324+
fd.setWriteDeadline(deadline)
325+
deferfd.setWriteDeadline(noDeadline)
326+
}
320327
if!canUseConnectEx(fd.net) {
321328
returnsyscall.Connect(fd.sysfd,ra)
322329
}

‎src/pkg/net/sock_posix.go‎

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -107,24 +107,18 @@ func (fd *netFD) dial(laddr, raddr sockaddr, deadline time.Time, toAddr func(sys
107107
}
108108
}
109109
}
110-
iferr:=fd.init();err!=nil {
111-
returnerr
112-
}
113110
varrsa syscall.Sockaddr
114111
ifraddr!=nil {
115112
ifrsa,err=raddr.sockaddr(fd.family);err!=nil {
116113
returnerr
117-
}elseifrsa!=nil {
118-
if!deadline.IsZero() {
119-
fd.setWriteDeadline(deadline)
120-
}
121-
iferr:=fd.connect(lsa,rsa);err!=nil {
122-
returnerr
123-
}
124-
fd.isConnected=true
125-
if!deadline.IsZero() {
126-
fd.setWriteDeadline(noDeadline)
127-
}
114+
}
115+
iferr:=fd.connect(lsa,rsa,deadline);err!=nil {
116+
returnerr
117+
}
118+
fd.isConnected=true
119+
}else {
120+
iferr:=fd.init();err!=nil {
121+
returnerr
128122
}
129123
}
130124
lsa,_=syscall.Getsockname(fd.sysfd)

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp