diff options
author | Mikio Hara <mikioh.mikioh@gmail.com> | 2011-08-16 16:53:09 -0400 |
---|---|---|
committer | Russ Cox <rsc@golang.org> | 2011-08-16 16:53:09 -0400 |
commit | c20ced956ece23a5e8f1d5b6e48ad9ba8e8c5d05 (patch) | |
tree | 610ea0f1666b3855788095aae467b7d8b146fb97 | |
parent | a2677cf363f9d17b416795c621c6bd7de5dcd642 (diff) | |
download | go-c20ced956ece23a5e8f1d5b6e48ad9ba8e8c5d05.tar.gz go-c20ced956ece23a5e8f1d5b6e48ad9ba8e8c5d05.zip |
net: return correct local address for an accepted TCP connection
Fixes #2127.
R=rsc
CC=golang-dev
https://golang.org/cl/4873043
-rw-r--r-- | src/pkg/net/fd.go | 7 |
1 files changed, 4 insertions, 3 deletions
diff --git a/src/pkg/net/fd.go b/src/pkg/net/fd.go index cd1a21dc36..fd39d858c3 100644 --- a/src/pkg/net/fd.go +++ b/src/pkg/net/fd.go @@ -591,13 +591,13 @@ func (fd *netFD) accept(toAddr func(syscall.Sockaddr) Addr) (nfd *netFD, err os. // because we have put fd.sysfd into non-blocking mode. syscall.ForkLock.RLock() var s, e int - var sa syscall.Sockaddr + var rsa syscall.Sockaddr for { if fd.closing { syscall.ForkLock.RUnlock() return nil, os.EINVAL } - s, sa, e = syscall.Accept(fd.sysfd) + s, rsa, e = syscall.Accept(fd.sysfd) if e != syscall.EAGAIN { break } @@ -616,7 +616,8 @@ func (fd *netFD) accept(toAddr func(syscall.Sockaddr) Addr) (nfd *netFD, err os. syscall.Close(s) return nil, err } - nfd.setAddr(fd.laddr, toAddr(sa)) + lsa, _ := syscall.Getsockname(nfd.sysfd) + nfd.setAddr(toAddr(lsa), toAddr(rsa)) return nfd, nil } |