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,