xerrors: fix crash in As
Analogous change to CL 168598
Fixes golang/go#30970.
Change-Id: I1810418a9d7cf92a35ca0f4a6d1b2bad560ab671
Reviewed-on: https://go-review.googlesource.com/c/xerrors/+/170960
Reviewed-by: Damien Neil <dneil@google.com>
Run-TryBot: Marcel van Lohuizen <mpvl@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
diff --git a/wrap.go b/wrap.go
index a33459d..ebfe244 100644
--- a/wrap.go
+++ b/wrap.go
@@ -88,7 +88,7 @@
panic("errors: *target must be interface or implement error")
}
targetType := typ.Elem()
- for {
+ for err != nil {
if reflect.TypeOf(err).AssignableTo(targetType) {
val.Elem().Set(reflect.ValueOf(err))
return true
@@ -96,10 +96,9 @@
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 = reflect.TypeOf((*error)(nil)).Elem()
diff --git a/wrap_test.go b/wrap_test.go
index d08c325..1aec966 100644
--- a/wrap_test.go
+++ b/wrap_test.go
@@ -30,6 +30,7 @@
match bool
}{
{nil, nil, true},
+ {nil, err1, false},
{err1, nil, false},
{err1, err1, true},
{erra, err1, true},
@@ -89,6 +90,10 @@
target interface{}
match bool
}{{
+ nil,
+ &errP,
+ false,
+ }, {
xerrors.Errorf("pittied the fool: %w", errorT{}),
&errT,
true,