mirror of
https://github.com/golang/go.git
synced 2026-04-03 01:40:30 +09:00
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:
committed by
Quim Muntal
parent
b7d1c58875
commit
9e0b5684e1
@@ -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 {
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user