aboutsummaryrefslogtreecommitdiff
path: root/src/errors
diff options
context:
space:
mode:
authorLE Manh Cuong <cuong.manhle.vn@gmail.com>2019-05-05 23:20:26 +0700
committerBrad Fitzpatrick <bradfitz@golang.org>2019-05-06 17:02:59 +0000
commit0bf1f02ed921ec2f78b27f133e7a688d3e8fa82e (patch)
tree62c1ad2005535404765125562597f0ee3ec2a842 /src/errors
parent79f79c34deba28934d42d4a1b2ab72d124d737a2 (diff)
downloadgo-0bf1f02ed921ec2f78b27f133e7a688d3e8fa82e.tar.xz
errors: fix Is panics if target is uncomparable
Fixes #31841 Change-Id: I3f068686154fd2fa5755b0df47b4eaa5c9a19107 Reviewed-on: https://go-review.googlesource.com/c/go/+/175260 Reviewed-by: Damien Neil <dneil@google.com> Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org> Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org>
Diffstat (limited to 'src/errors')
-rw-r--r--src/errors/wrap.go4
-rw-r--r--src/errors/wrap_test.go19
2 files changed, 22 insertions, 1 deletions
diff --git a/src/errors/wrap.go b/src/errors/wrap.go
index 04ddf79ba3..69dd9464ec 100644
--- a/src/errors/wrap.go
+++ b/src/errors/wrap.go
@@ -51,8 +51,10 @@ func Is(err, target error) bool {
if target == nil {
return err == target
}
+
+ isComparable := target == nil || reflectlite.TypeOf(target).Comparable()
for {
- if err == target {
+ if isComparable && err == target {
return true
}
if x, ok := err.(interface{ Is(error) bool }); ok && x.Is(target) {
diff --git a/src/errors/wrap_test.go b/src/errors/wrap_test.go
index 022f429c0c..f8e907cff7 100644
--- a/src/errors/wrap_test.go
+++ b/src/errors/wrap_test.go
@@ -47,6 +47,12 @@ func TestIs(t *testing.T) {
{poser, errb, false},
{poser, erro, false},
{poser, errco, false},
+ {errorUncomparable{}, errorUncomparable{}, true},
+ {errorUncomparable{}, &errorUncomparable{}, false},
+ {&errorUncomparable{}, errorUncomparable{}, true},
+ {&errorUncomparable{}, &errorUncomparable{}, false},
+ {errorUncomparable{}, err1, false},
+ {&errorUncomparable{}, err1, false},
}
for _, tc := range testCases {
t.Run("", func(t *testing.T) {
@@ -260,3 +266,16 @@ type printer struct {
}
func (p *printer) Print(args ...interface{}) { fmt.Fprint(&p.buf, args...) }
+
+type errorUncomparable struct {
+ f []string
+}
+
+func (errorUncomparable) Error() string {
+ return "uncomparable error"
+}
+
+func (errorUncomparable) Is(target error) bool {
+ _, ok := target.(errorUncomparable)
+ return ok
+}