internal/poll: don't pass non-nil WSAMsg.Name with 0 namelen on windows

CL 692436 changed WriteMsgInet{4,6} on windows to pass a zero namelen
when the sockaddr is nil. Turns out Windows also requires name to be
nil when namelen is 0.

With this commit, WriteMsgInet4 and WriteMsgInet6 now nicely align with
WriteMsg.

For #74841

Change-Id: Ifadee2d12d9bce2411f11a0e12b9fa2b3d71990e
Reviewed-on: https://go-review.googlesource.com/c/go/+/698395
Reviewed-by: Damien Neil <dneil@google.com>
Reviewed-by: Sean Liao <sean@liao.dev>
Auto-Submit: Sean Liao <sean@liao.dev>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Carlos Amedee <carlos@golang.org>
Auto-Submit: Damien Neil <dneil@google.com>
This commit is contained in:
database64128 2025-08-22 14:53:45 +08:00 committed by Gopher Robot
parent 52c3f73fda
commit 78a05c541f

View file

@ -1419,16 +1419,14 @@ func (fd *FD) WriteMsgInet4(p []byte, oob []byte, sa *syscall.SockaddrInet4) (in
defer fd.writeUnlock() defer fd.writeUnlock()
o := &fd.wop o := &fd.wop
if o.rsa == nil {
o.rsa = new(syscall.RawSockaddrAny)
}
var nameLen int32
if sa != nil {
nameLen = sockaddrInet4ToRaw(o.rsa, sa)
}
msg := newWSAMsg(p, oob, 0) msg := newWSAMsg(p, oob, 0)
msg.Name = (syscall.Pointer)(unsafe.Pointer(o.rsa)) if sa != nil {
msg.Namelen = nameLen if o.rsa == nil {
o.rsa = new(syscall.RawSockaddrAny)
}
msg.Name = (syscall.Pointer)(unsafe.Pointer(o.rsa))
msg.Namelen = sockaddrInet4ToRaw(o.rsa, sa)
}
n, err := fd.execIO(o, func(o *operation) (qty uint32, err error) { n, err := fd.execIO(o, func(o *operation) (qty uint32, err error) {
err = windows.WSASendMsg(fd.Sysfd, &msg, 0, nil, &o.o, nil) err = windows.WSASendMsg(fd.Sysfd, &msg, 0, nil, &o.o, nil)
return qty, err return qty, err
@ -1448,16 +1446,14 @@ func (fd *FD) WriteMsgInet6(p []byte, oob []byte, sa *syscall.SockaddrInet6) (in
defer fd.writeUnlock() defer fd.writeUnlock()
o := &fd.wop o := &fd.wop
if o.rsa == nil {
o.rsa = new(syscall.RawSockaddrAny)
}
msg := newWSAMsg(p, oob, 0) msg := newWSAMsg(p, oob, 0)
var nameLen int32
if sa != nil { if sa != nil {
nameLen = sockaddrInet6ToRaw(o.rsa, sa) if o.rsa == nil {
o.rsa = new(syscall.RawSockaddrAny)
}
msg.Name = (syscall.Pointer)(unsafe.Pointer(o.rsa))
msg.Namelen = sockaddrInet6ToRaw(o.rsa, sa)
} }
msg.Name = (syscall.Pointer)(unsafe.Pointer(o.rsa))
msg.Namelen = nameLen
n, err := fd.execIO(o, func(o *operation) (qty uint32, err error) { n, err := fd.execIO(o, func(o *operation) (qty uint32, err error) {
err = windows.WSASendMsg(fd.Sysfd, &msg, 0, nil, &o.o, nil) err = windows.WSASendMsg(fd.Sysfd, &msg, 0, nil, &o.o, nil)
return qty, err return qty, err