net: return correct local address for an accepted TCP connection
Fixes #2127.
R=rsc
CC=golang-dev
https://golang.org/cl/4873043
diff --git a/src/pkg/net/fd.go b/src/pkg/net/fd.go
index cd1a21d..fd39d85 100644
--- a/src/pkg/net/fd.go
+++ b/src/pkg/net/fd.go
@@ -591,13 +591,13 @@
// 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 @@
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
}