aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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)
+ }
+}