From d56a444946b7486c9d43f5150b0a0e5415982f23 Mon Sep 17 00:00:00 2001 From: freemans13 Date: Thu, 29 Jan 2026 21:50:52 +0000 Subject: [PATCH] wrapped error high cpu fix (was not committed to previous PR) --- errors/errors.go | 24 ++++++++++-------------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/errors/errors.go b/errors/errors.go index 40d9086f2a..23cbad7185 100644 --- a/errors/errors.go +++ b/errors/errors.go @@ -13,7 +13,6 @@ package errors import ( "errors" "fmt" - "reflect" "runtime" "strings" "unicode/utf8" @@ -191,25 +190,22 @@ func (e *Error) As(target interface{}) bool { return true } - // 1. Try the data payload. + // Try the data payload (not reachable via Unwrap, so check it here). if err, ok := e.data.(error); ok { - var as interface{ As(interface{}) bool } - if as, ok = err.(interface{ As(interface{}) bool }); ok && as.As(target) { - return true - } - } - - // 2. Try an explicitly wrapped error. - if err := e.wrappedErr; err != nil && !reflect.ValueOf(err).IsNil() { if as, ok := err.(interface{ As(interface{}) bool }); ok && as.As(target) { return true } } - // 3. Finally, get whatever "errors.Unwrap" gives us. - if err := errors.Unwrap(e); err != nil { - if as, ok := err.(interface{ As(interface{}) bool }); ok && as.As(target) { - return true + // Try wrapped error, but ONLY if it's not an *Error type. + // If wrapped error is *Error, skip here - Go's errors.As will find it via Unwrap(). + // This prevents infinite recursion when *Error wraps *Error. + if e.wrappedErr != nil { + // Skip if wrapped error is *Error to avoid recursive loop + if _, isError := e.wrappedErr.(*Error); !isError { + if as, ok := e.wrappedErr.(interface{ As(interface{}) bool }); ok && as.As(target) { + return true + } } }