mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
net: fix inconsistent error values on Read
This change fixes inconsistent error values on Read,
ReadFrom{,UDP,IP,Unix} and ReadMsg{UDP,IP,Unix}.
Updates #4856.
Change-Id: I7de5663094e09be2d78cdb18ce6f1e7ec260888d
Reviewed-on: https://go-review.googlesource.com/8992
Reviewed-by: Ian Lance Taylor <iant@golang.org>
This commit is contained in:
parent
951f74c4d0
commit
ec1144423f
17 changed files with 139 additions and 49 deletions
|
|
@ -6,6 +6,7 @@ package net
|
|||
|
||||
import (
|
||||
"fmt"
|
||||
"io"
|
||||
"net/internal/socktest"
|
||||
"os"
|
||||
"runtime"
|
||||
|
|
@ -248,3 +249,46 @@ func TestListenPacketError(t *testing.T) {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
// parseReadError parses nestedErr and reports whether it is a valid
|
||||
// error value from Read functions.
|
||||
// It returns nil when nestedErr is valid.
|
||||
func parseReadError(nestedErr error) error {
|
||||
if nestedErr == nil {
|
||||
return nil
|
||||
}
|
||||
|
||||
switch err := nestedErr.(type) {
|
||||
case *OpError:
|
||||
if err := err.isValid(); err != nil {
|
||||
return err
|
||||
}
|
||||
nestedErr = err.Err
|
||||
goto second
|
||||
}
|
||||
if nestedErr == io.EOF {
|
||||
return nil
|
||||
}
|
||||
return fmt.Errorf("unexpected type on 1st nested level: %T", nestedErr)
|
||||
|
||||
second:
|
||||
if isPlatformError(nestedErr) {
|
||||
return nil
|
||||
}
|
||||
switch err := nestedErr.(type) {
|
||||
case *os.SyscallError:
|
||||
nestedErr = err.Err
|
||||
goto third
|
||||
}
|
||||
switch nestedErr {
|
||||
case errClosing, errTimeout:
|
||||
return nil
|
||||
}
|
||||
return fmt.Errorf("unexpected type on 2nd nested level: %T", nestedErr)
|
||||
|
||||
third:
|
||||
if isPlatformError(nestedErr) {
|
||||
return nil
|
||||
}
|
||||
return fmt.Errorf("unexpected type on 3rd nested level: %T", nestedErr)
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue