Skip to content

Commit 1f06c39

Browse files
committed
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 <[email protected]> Run-TryBot: Marcel van Lohuizen <[email protected]> TryBot-Result: Gobot Gobot <[email protected]>
1 parent d61658b commit 1f06c39

File tree

2 files changed

+8
-4
lines changed

2 files changed

+8
-4
lines changed

wrap.go

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -88,18 +88,17 @@ func As(err error, target interface{}) bool {
8888
panic("errors: *target must be interface or implement error")
8989
}
9090
targetType := typ.Elem()
91-
for {
91+
for err != nil {
9292
if reflect.TypeOf(err).AssignableTo(targetType) {
9393
val.Elem().Set(reflect.ValueOf(err))
9494
return true
9595
}
9696
if x, ok := err.(interface{ As(interface{}) bool }); ok && x.As(target) {
9797
return true
9898
}
99-
if err = Unwrap(err); err == nil {
100-
return false
101-
}
99+
err = Unwrap(err)
102100
}
101+
return false
103102
}
104103

105104
var errorType = reflect.TypeOf((*error)(nil)).Elem()

wrap_test.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ func TestIs(t *testing.T) {
3030
match bool
3131
}{
3232
{nil, nil, true},
33+
{nil, err1, false},
3334
{err1, nil, false},
3435
{err1, err1, true},
3536
{erra, err1, true},
@@ -89,6 +90,10 @@ func TestAs(t *testing.T) {
8990
target interface{}
9091
match bool
9192
}{{
93+
nil,
94+
&errP,
95+
false,
96+
}, {
9297
xerrors.Errorf("pittied the fool: %w", errorT{}),
9398
&errT,
9499
true,

0 commit comments

Comments
 (0)