aboutsummaryrefslogtreecommitdiff
path: root/src/errors
diff options
context:
space:
mode:
authorAhsun Ahmed <ahmed.ahsun@gmail.com>2019-03-21 22:45:49 +0600
committerMarcel van Lohuizen <mpvl@golang.org>2019-04-10 15:59:35 +0000
commitfda5e6d6fa7abfe974a58dfeeceb95a8165d1b63 (patch)
tree9f9e293052703b687e7c38fbf16454fba1aca51b /src/errors
parent607493bed678cbf3a456e9de8e7e74622ec83da8 (diff)
downloadgo-fda5e6d6fa7abfe974a58dfeeceb95a8165d1b63.tar.gz
go-fda5e6d6fa7abfe974a58dfeeceb95a8165d1b63.zip
errors: return false if nil error is passed to As
Fixes #30970 Change-Id: I333676b55a2364e329fffeafca8fc57d45a0b84b Reviewed-on: https://go-review.googlesource.com/c/go/+/168598 Reviewed-by: Marcel van Lohuizen <mpvl@golang.org> Run-TryBot: Marcel van Lohuizen <mpvl@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org>
Diffstat (limited to 'src/errors')
-rw-r--r--src/errors/wrap.go9
-rw-r--r--src/errors/wrap_test.go4
2 files changed, 8 insertions, 5 deletions
diff --git a/src/errors/wrap.go b/src/errors/wrap.go
index fc7bf71f8a..b1a15d01dd 100644
--- a/src/errors/wrap.go
+++ b/src/errors/wrap.go
@@ -72,7 +72,7 @@ func Is(err, target error) bool {
// matches a type if it is assignable to the target type, or if it has a method
// As(interface{}) bool such that As(target) returns true. As will panic if
// target is not a non-nil pointer to a type which implements error or is of
-// interface type.
+// interface type. As returns false if error is nil.
//
// The As method should set the target to its value and return true if err
// matches the type to which target points.
@@ -89,7 +89,7 @@ func As(err error, target interface{}) bool {
panic("errors: *target must be interface or implement error")
}
targetType := typ.Elem()
- for {
+ for err != nil {
if reflectlite.TypeOf(err).AssignableTo(targetType) {
val.Elem().Set(reflectlite.ValueOf(err))
return true
@@ -97,10 +97,9 @@ func As(err error, target interface{}) bool {
if x, ok := err.(interface{ As(interface{}) bool }); ok && x.As(target) {
return true
}
- if err = Unwrap(err); err == nil {
- return false
- }
+ err = Unwrap(err)
}
+ return false
}
var errorType = reflectlite.TypeOf((*error)(nil)).Elem()
diff --git a/src/errors/wrap_test.go b/src/errors/wrap_test.go
index 657890c1a6..022f429c0c 100644
--- a/src/errors/wrap_test.go
+++ b/src/errors/wrap_test.go
@@ -90,6 +90,10 @@ func TestAs(t *testing.T) {
target interface{}
match bool
}{{
+ nil,
+ &errP,
+ false,
+ }, {
wrapped{"pittied the fool", errorT{}},
&errT,
true,