mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
os, net, internal/poll: return consistent error for closed socket
In the past we returned "use of closed network connection" when using a closed network descriptor in some way. In CL 36799 that was changed to return "use of closed file or network connection". Because programs have no access to a value of this error type (see issue #4373) they resort to doing direct string comparisons (see issue #19252). This CL restores the old error string so that we don't break programs unnecessarily with the 1.9 release. This adds a test to the net package for the expected string. For symmetry check that the os package returns the expected error, which for os already exists as os.ErrClosed. Updates #4373. Fixed #19252. Change-Id: I5b83fd12cfa03501a077cad9336499b819f4a38b Reviewed-on: https://go-review.googlesource.com/39997 Run-TryBot: Ian Lance Taylor <iant@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org> Reviewed-by: Russ Cox <rsc@golang.org>
This commit is contained in:
parent
2fb2ebc32e
commit
fb4b4342fe
19 changed files with 143 additions and 99 deletions
|
|
@ -87,20 +87,18 @@ func newFile(fd uintptr, name string, pollable bool) *File {
|
|||
pollable = false
|
||||
}
|
||||
|
||||
if pollable {
|
||||
if err := f.pfd.Init(); err != nil {
|
||||
// An error here indicates a failure to register
|
||||
// with the netpoll system. That can happen for
|
||||
// a file descriptor that is not supported by
|
||||
// epoll/kqueue; for example, disk files on
|
||||
// GNU/Linux systems. We assume that any real error
|
||||
// will show up in later I/O.
|
||||
} else {
|
||||
// We successfully registered with netpoll, so put
|
||||
// the file into nonblocking mode.
|
||||
if err := syscall.SetNonblock(fdi, true); err == nil {
|
||||
f.nonblock = true
|
||||
}
|
||||
if err := f.pfd.Init("file", pollable); err != nil {
|
||||
// An error here indicates a failure to register
|
||||
// with the netpoll system. That can happen for
|
||||
// a file descriptor that is not supported by
|
||||
// epoll/kqueue; for example, disk files on
|
||||
// GNU/Linux systems. We assume that any real error
|
||||
// will show up in later I/O.
|
||||
} else if pollable {
|
||||
// We successfully registered with netpoll, so put
|
||||
// the file into nonblocking mode.
|
||||
if err := syscall.SetNonblock(fdi, true); err == nil {
|
||||
f.nonblock = true
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue