internal/poll: permit nil destination address in WriteMsg{Inet4,Inet6}

For #74841

Change-Id: If2ea23b1eb23e32680bd576f54a0020d7e115797
Reviewed-on: https://go-review.googlesource.com/c/go/+/692436
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Carlos Amedee <carlos@golang.org>
Reviewed-by: Damien Neil <dneil@google.com>
This commit is contained in:
database64128 2025-08-02 00:40:36 +08:00 committed by Sean Liao
parent 9b0a507735
commit 13c082601d

View file

@ -1422,10 +1422,13 @@ func (fd *FD) WriteMsgInet4(p []byte, oob []byte, sa *syscall.SockaddrInet4) (in
if o.rsa == nil { if o.rsa == nil {
o.rsa = new(syscall.RawSockaddrAny) o.rsa = new(syscall.RawSockaddrAny)
} }
len := sockaddrInet4ToRaw(o.rsa, sa) 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)) msg.Name = (syscall.Pointer)(unsafe.Pointer(o.rsa))
msg.Namelen = len 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
@ -1449,9 +1452,12 @@ func (fd *FD) WriteMsgInet6(p []byte, oob []byte, sa *syscall.SockaddrInet6) (in
o.rsa = new(syscall.RawSockaddrAny) o.rsa = new(syscall.RawSockaddrAny)
} }
msg := newWSAMsg(p, oob, 0) msg := newWSAMsg(p, oob, 0)
len := sockaddrInet6ToRaw(o.rsa, sa) var nameLen int32
if sa != nil {
nameLen = sockaddrInet6ToRaw(o.rsa, sa)
}
msg.Name = (syscall.Pointer)(unsafe.Pointer(o.rsa)) msg.Name = (syscall.Pointer)(unsafe.Pointer(o.rsa))
msg.Namelen = len 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