Skip to content

Commit

Permalink
net: make ErrClosed and ParseError implement net.Error
Browse files Browse the repository at this point in the history
Fixes #45357

Change-Id: Iafd41fff232a89be4c88d4b1d66bc3c04d888bcc
Reviewed-on: https://go-review.googlesource.com/c/go/+/307030
Trust: Ian Lance Taylor <iant@golang.org>
Trust: Josh Bleecher Snyder <josharian@gmail.com>
Run-TryBot: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Josh Bleecher Snyder <josharian@gmail.com>
  • Loading branch information
ianlancetaylor committed Apr 5, 2021
1 parent a1a45af commit e985245
Show file tree
Hide file tree
Showing 3 changed files with 39 additions and 5 deletions.
19 changes: 15 additions & 4 deletions src/internal/poll/fd.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,22 @@ import (
"errors"
)

// ErrNetClosing is returned when a network descriptor is used after
// it has been closed. Keep this string consistent because of issue
// #4373: since historically programs have not been able to detect
// errNetClosing is the type of the variable ErrNetClosing.
// This is used to implement the net.Error interface.
type errNetClosing struct{}

// Error returns the error message for ErrNetClosing.
// Keep this string consistent because of issue #4373:
// since historically programs have not been able to detect
// this error, they look for the string.
var ErrNetClosing = errors.New("use of closed network connection")
func (e errNetClosing) Error() string { return "use of closed network connection" }

func (e errNetClosing) Timeout() bool { return false }
func (e errNetClosing) Temporary() bool { return false }

// ErrNetClosing is returned when a network descriptor is used after
// it has been closed.
var ErrNetClosing = errNetClosing{}

// ErrFileClosing is returned when a file descriptor is used after it
// has been closed.
Expand Down
5 changes: 4 additions & 1 deletion src/net/net.go
Original file line number Diff line number Diff line change
Expand Up @@ -539,6 +539,9 @@ type ParseError struct {

func (e *ParseError) Error() string { return "invalid " + e.Type + ": " + e.Text }

func (e *ParseError) Timeout() bool { return false }
func (e *ParseError) Temporary() bool { return false }

type AddrError struct {
Err string
Addr string
Expand Down Expand Up @@ -642,7 +645,7 @@ var errClosed = poll.ErrNetClosing
// another goroutine before the I/O is completed. This may be wrapped
// in another error, and should normally be tested using
// errors.Is(err, net.ErrClosed).
var ErrClosed = errClosed
var ErrClosed error = errClosed

type writerOnly struct {
io.Writer
Expand Down
20 changes: 20 additions & 0 deletions src/net/net_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -588,3 +588,23 @@ func TestNotTemporaryRead(t *testing.T) {
}
withTCPConnPair(t, client, server)
}

// The various errors should implement the Error interface.
func TestErrors(t *testing.T) {
var (
_ Error = &OpError{}
_ Error = &ParseError{}
_ Error = &AddrError{}
_ Error = UnknownNetworkError("")
_ Error = InvalidAddrError("")
_ Error = &timeoutError{}
_ Error = &DNSConfigError{}
_ Error = &DNSError{}
)

// ErrClosed was introduced as type error, so we can't check
// it using a declaration.
if _, ok := ErrClosed.(Error); !ok {
t.Fatal("ErrClosed does not implement Error")
}
}

0 comments on commit e985245

Please sign in to comment.