Skip to content

Commit 3114bd6

Browse files
picoHzalexbrainman
authored andcommitted
net: disable SIO_UDP_CONNRESET behavior on windows.
Fixes #5834. LGTM=alex.brainman R=golang-codereviews, bradfitz, alex.brainman, mikioh.mikioh, in60jp, iant CC=golang-codereviews https://golang.org/cl/149510043
1 parent 7abc8c4 commit 3114bd6

File tree

3 files changed

+49
-0
lines changed

3 files changed

+49
-0
lines changed

src/net/fd_windows.go

+12
Original file line numberDiff line numberDiff line change
@@ -294,6 +294,18 @@ func (fd *netFD) init() error {
294294
fd.skipSyncNotif = true
295295
}
296296
}
297+
// Disable SIO_UDP_CONNRESET behavior.
298+
// http://support.microsoft.com/kb/263823
299+
switch fd.net {
300+
case "udp", "udp4", "udp6":
301+
ret := uint32(0)
302+
flag := uint32(0)
303+
size := uint32(unsafe.Sizeof(flag))
304+
err := syscall.WSAIoctl(fd.sysfd, syscall.SIO_UDP_CONNRESET, (*byte)(unsafe.Pointer(&flag)), size, nil, 0, &ret, nil, 0)
305+
if err != nil {
306+
return os.NewSyscallError("WSAIoctl", err)
307+
}
308+
}
297309
fd.rop.mode = 'r'
298310
fd.wop.mode = 'w'
299311
fd.rop.fd = fd

src/net/udp_test.go

+36
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99
"runtime"
1010
"strings"
1111
"testing"
12+
"time"
1213
)
1314

1415
func TestResolveUDPAddr(t *testing.T) {
@@ -34,6 +35,41 @@ func TestResolveUDPAddr(t *testing.T) {
3435
}
3536
}
3637

38+
func TestReadFromUDP(t *testing.T) {
39+
ra, err := ResolveUDPAddr("udp", "127.0.0.1:7")
40+
if err != nil {
41+
t.Fatal(err)
42+
}
43+
44+
la, err := ResolveUDPAddr("udp", "127.0.0.1:0")
45+
if err != nil {
46+
t.Fatal(err)
47+
}
48+
49+
c, err := ListenUDP("udp", la)
50+
if err != nil {
51+
t.Fatal(err)
52+
}
53+
defer c.Close()
54+
55+
_, err = c.WriteToUDP([]byte("a"), ra)
56+
if err != nil {
57+
t.Fatal(err)
58+
}
59+
60+
err = c.SetDeadline(time.Now().Add(100 * time.Millisecond))
61+
if err != nil {
62+
t.Fatal(err)
63+
}
64+
b := make([]byte, 1)
65+
_, _, err = c.ReadFromUDP(b)
66+
if err == nil {
67+
t.Fatal("ReadFromUDP should fail")
68+
} else if !isTimeout(err) {
69+
t.Fatal(err)
70+
}
71+
}
72+
3773
func TestWriteToUDP(t *testing.T) {
3874
switch runtime.GOOS {
3975
case "plan9":

src/syscall/ztypes_windows.go

+1
Original file line numberDiff line numberDiff line change
@@ -547,6 +547,7 @@ const (
547547
IOC_WS2 = 0x08000000
548548
SIO_GET_EXTENSION_FUNCTION_POINTER = IOC_INOUT | IOC_WS2 | 6
549549
SIO_KEEPALIVE_VALS = IOC_IN | IOC_VENDOR | 4
550+
SIO_UDP_CONNRESET = IOC_IN | IOC_VENDOR | 12
550551

551552
// cf. http://support.microsoft.com/default.aspx?scid=kb;en-us;257460
552553

0 commit comments

Comments
 (0)