net: correctly handle non-nil empty cmsg buffer on windows

Fixes #77875.

Change-Id: I0ed91be7ed10c04ddea3af55548a8dbf0be5f3a8
Reviewed-on: https://go-review.googlesource.com/c/go/+/750420
Reviewed-by: Quim Muntal <quimmuntal@gmail.com>
Reviewed-by: Damien Neil <dneil@google.com>
Reviewed-by: David Chase <drchase@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
This commit is contained in:
database64128
2026-03-02 00:43:57 +08:00
committed by Quim Muntal
parent b7d1c58875
commit 9e0b5684e1
2 changed files with 47 additions and 3 deletions

View File

@@ -167,9 +167,11 @@ func newWSAMsg(p []byte, oob []byte, flags int, unconnected bool) *windows.WSAMs
msg := wsaMsgPool.Get().(*windows.WSAMsg)
msg.Buffers.Len = uint32(len(p))
msg.Buffers.Buf = unsafe.SliceData(p)
msg.Control = syscall.WSABuf{
Len: uint32(len(oob)),
Buf: unsafe.SliceData(oob),
if len(oob) > 0 {
msg.Control = syscall.WSABuf{
Len: uint32(len(oob)),
Buf: unsafe.SliceData(oob),
}
}
msg.Flags = uint32(flags)
if unconnected {

View File

@@ -750,3 +750,45 @@ func TestIPv4WriteMsgUDPAddrPortTargetAddrIPVersion(t *testing.T) {
t.Errorf("conn.WriteMsgUDPAddrPort(buf, nil, daddr6) should have failed, but got no error")
}
}
// TestReadWriteMsgUDPAddrPortEmptyCmsg verifies that ReadMsgUDPAddrPort and
// WriteMsgUDPAddrPort won't fail when the cmsg buffer (the oob parameter) is
// non-nil but empty.
//
// This is a regression test for https://golang.org/issue/77875.
func TestReadWriteMsgUDPAddrPortEmptyCmsg(t *testing.T) {
switch runtime.GOOS {
case "plan9":
t.Skipf("not supported on %s", runtime.GOOS)
}
if !testableNetwork("udp4") {
t.Skipf("skipping: udp4 not available")
}
conn, err := ListenUDP("udp4", &UDPAddr{IP: IPv4(127, 0, 0, 1)})
if err != nil {
t.Fatal(err)
}
defer conn.Close()
buf := make([]byte, 8)
cmsgBuf := make([]byte, 8)[:0]
daddr := conn.LocalAddr().(*UDPAddr).AddrPort()
_, cmsgn, err := conn.WriteMsgUDPAddrPort(buf, cmsgBuf, daddr)
if err != nil {
t.Fatalf("WriteMsgUDPAddrPort failed: %v", err)
}
if cmsgn != 0 {
t.Errorf("WriteMsgUDPAddrPort wrote %d cmsg bytes; want 0", cmsgn)
}
_, cmsgn, _, _, err = conn.ReadMsgUDPAddrPort(buf, cmsgBuf)
if err != nil {
t.Fatalf("ReadMsgUDPAddrPort failed: %v", err)
}
if cmsgn != 0 {
t.Errorf("ReadMsgUDPAddrPort read %d cmsg bytes; want 0", cmsgn)
}
}