From fda5e6d6fa7abfe974a58dfeeceb95a8165d1b63 Mon Sep 17 00:00:00 2001 From: Ahsun Ahmed Date: Thu, 21 Mar 2019 22:45:49 +0600 Subject: [PATCH] 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 Run-TryBot: Marcel van Lohuizen TryBot-Result: Gobot Gobot --- src/errors/wrap.go | 9 ++++----- src/errors/wrap_test.go | 4 ++++ 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, -- 2.50.0