aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordatabase64128 <free122448@hotmail.com>2026-03-02 00:43:57 +0800
committerCarlos Amedee <carlos@golang.org>2026-03-19 14:02:32 -0700
commit99df9bdb2a014a0873b62b3f81d04970477004ad (patch)
tree5344441050a5809bf0bc9bfc677fbfb9b8c3b61a
parentace2cf66521bd063f0c4a5ab74ba88b0d9c5b9fa (diff)
downloadgo-99df9bdb2a014a0873b62b3f81d04970477004ad.tar.xz
[release-branch.go1.26] net: correctly handle non-nil empty cmsg buffer on windows
Updates #77875 Fixes #77885 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> (cherry picked from commit 9e0b5684e1f7166d6427635673001c80218ac9f4) Reviewed-on: https://go-review.googlesource.com/c/go/+/753060 Reviewed-by: Dmitri Shuralyov <dmitshur@google.com>
-rw-r--r--src/internal/poll/fd_windows.go8
-rw-r--r--src/net/udpsock_test.go42
2 files changed, 47 insertions, 3 deletions
diff --git a/src/internal/poll/fd_windows.go b/src/internal/poll/fd_windows.go
index edad656350..2ba967f990 100644
--- a/src/internal/poll/fd_windows.go
+++ b/src/internal/poll/fd_windows.go
@@ -159,9 +159,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 {
diff --git a/src/net/udpsock_test.go b/src/net/udpsock_test.go
index a79e9f83c1..1700ebaad1 100644
--- a/src/net/udpsock_test.go
+++ b/src/net/udpsock_test.go
@@ -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)
+ }
+}