Skip to content

Commit a877e81

Browse files
committed
net: don't return io.EOF on reading data from datagram, raw sockets on windows
Preventing returning io.EOF on non-connection oriented sockets is already applied to Unix variants. This CL applies it to Windows. Update #4856. Change-Id: I82071d40f617e2962d0540b9d1d6a10ea4cdb2ec Reviewed-on: https://go-review.googlesource.com/2203 Reviewed-by: Ian Lance Taylor <[email protected]> Reviewed-by: Alex Brainman <[email protected]>
1 parent a456801 commit a877e81

File tree

4 files changed

+32
-21
lines changed

4 files changed

+32
-21
lines changed

src/net/fd_posix.go

+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
// Copyright 2009 The Go Authors. All rights reserved.
2+
// Use of this source code is governed by a BSD-style
3+
// license that can be found in the LICENSE file.
4+
5+
// +build darwin dragonfly freebsd linux nacl netbsd openbsd solaris windows
6+
7+
package net
8+
9+
import (
10+
"io"
11+
"syscall"
12+
)
13+
14+
// eofError returns io.EOF when fd is available for reading end of
15+
// file.
16+
func (fd *netFD) eofError(n int, err error) error {
17+
if n == 0 && err == nil && fd.sotype != syscall.SOCK_DGRAM && fd.sotype != syscall.SOCK_RAW {
18+
return io.EOF
19+
}
20+
return err
21+
}

src/net/fd_unix_test.go src/net/fd_posix_test.go

+6-7
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
// Use of this source code is governed by a BSD-style
33
// license that can be found in the LICENSE file.
44

5-
// +build darwin dragonfly freebsd linux netbsd openbsd solaris
5+
// +build darwin dragonfly freebsd linux nacl netbsd openbsd solaris windows
66

77
package net
88

@@ -12,13 +12,12 @@ import (
1212
"testing"
1313
)
1414

15-
var chkReadErrTests = []struct {
15+
var eofErrorTests = []struct {
1616
n int
1717
err error
1818
fd *netFD
1919
expected error
2020
}{
21-
2221
{100, nil, &netFD{sotype: syscall.SOCK_STREAM}, nil},
2322
{100, io.EOF, &netFD{sotype: syscall.SOCK_STREAM}, io.EOF},
2423
{100, errClosing, &netFD{sotype: syscall.SOCK_STREAM}, errClosing},
@@ -48,11 +47,11 @@ var chkReadErrTests = []struct {
4847
{0, errClosing, &netFD{sotype: syscall.SOCK_RAW}, errClosing},
4948
}
5049

51-
func TestChkReadErr(t *testing.T) {
52-
for _, tt := range chkReadErrTests {
53-
actual := chkReadErr(tt.n, tt.err, tt.fd)
50+
func TestEOFError(t *testing.T) {
51+
for _, tt := range eofErrorTests {
52+
actual := tt.fd.eofError(tt.n, tt.err)
5453
if actual != tt.expected {
55-
t.Errorf("chkReadError(%v, %v, %v): expected %v, actual %v", tt.n, tt.err, tt.fd.sotype, tt.expected, actual)
54+
t.Errorf("eofError(%v, %v, %v): expected %v, actual %v", tt.n, tt.err, tt.fd.sotype, tt.expected, actual)
5655
}
5756
}
5857
}

src/net/fd_unix.go

+3-10
Original file line numberDiff line numberDiff line change
@@ -244,7 +244,7 @@ func (fd *netFD) Read(p []byte) (n int, err error) {
244244
}
245245
}
246246
}
247-
err = chkReadErr(n, err, fd)
247+
err = fd.eofError(n, err)
248248
break
249249
}
250250
if err != nil && err != io.EOF {
@@ -271,7 +271,7 @@ func (fd *netFD) readFrom(p []byte) (n int, sa syscall.Sockaddr, err error) {
271271
}
272272
}
273273
}
274-
err = chkReadErr(n, err, fd)
274+
err = fd.eofError(n, err)
275275
break
276276
}
277277
if err != nil && err != io.EOF {
@@ -298,7 +298,7 @@ func (fd *netFD) readMsg(p []byte, oob []byte) (n, oobn, flags int, sa syscall.S
298298
}
299299
}
300300
}
301-
err = chkReadErr(n, err, fd)
301+
err = fd.eofError(n, err)
302302
break
303303
}
304304
if err != nil && err != io.EOF {
@@ -307,13 +307,6 @@ func (fd *netFD) readMsg(p []byte, oob []byte) (n, oobn, flags int, sa syscall.S
307307
return
308308
}
309309

310-
func chkReadErr(n int, err error, fd *netFD) error {
311-
if n == 0 && err == nil && fd.sotype != syscall.SOCK_DGRAM && fd.sotype != syscall.SOCK_RAW {
312-
return io.EOF
313-
}
314-
return err
315-
}
316-
317310
func (fd *netFD) Write(p []byte) (nn int, err error) {
318311
if err := fd.writeLock(); err != nil {
319312
return 0, err

src/net/fd_windows.go

+2-4
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ package net
66

77
import (
88
"errors"
9-
"io"
109
"os"
1110
"runtime"
1211
"sync"
@@ -468,12 +467,10 @@ func (fd *netFD) Read(buf []byte) (int, error) {
468467
n, err := rsrv.ExecIO(o, "WSARecv", func(o *operation) error {
469468
return syscall.WSARecv(o.fd.sysfd, &o.buf, 1, &o.qty, &o.flags, &o.o, nil)
470469
})
471-
if err == nil && n == 0 {
472-
err = io.EOF
473-
}
474470
if raceenabled {
475471
raceAcquire(unsafe.Pointer(&ioSync))
476472
}
473+
err = fd.eofError(n, err)
477474
return n, err
478475
}
479476

@@ -494,6 +491,7 @@ func (fd *netFD) readFrom(buf []byte) (n int, sa syscall.Sockaddr, err error) {
494491
o.rsan = int32(unsafe.Sizeof(*o.rsa))
495492
return syscall.WSARecvFrom(o.fd.sysfd, &o.buf, 1, &o.qty, &o.flags, o.rsa, &o.rsan, &o.o, nil)
496493
})
494+
err = fd.eofError(n, err)
497495
if err != nil {
498496
return 0, nil, err
499497
}

0 commit comments

Comments
 (0)