From 92af50281522320addcec46eb17838cb284e337f Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Mon, 6 Jan 2025 09:38:19 +0100 Subject: [PATCH] refactor: improve edge case handling for recursion limits (backport #22988) (#23191) Co-authored-by: haiyizxx Co-authored-by: Julien Robert --- CHANGELOG.md | 4 ++++ codec/types/interface_registry.go | 4 ++-- codec/unknownproto/unknown_fields.go | 2 +- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 42ca411e2f..d5a73d9aa3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -40,6 +40,10 @@ Ref: https://keepachangelog.com/en/1.0.0/ Every module contains its own CHANGELOG.md. Please refer to the module you are interested in. +### Improvements + +* (codec) [#22988](https://github.com/cosmos/cosmos-sdk/pull/22988) Improve edge case handling for recursion limits. + ### Bug Fixes * (x/auth/tx) [#23148](https://github.com/cosmos/cosmos-sdk/pull/23148) Avoid panic from intoAnyV2 when v1.PublicKey is optional. diff --git a/codec/types/interface_registry.go b/codec/types/interface_registry.go index 34d59bd33a..68ed8c885d 100644 --- a/codec/types/interface_registry.go +++ b/codec/types/interface_registry.go @@ -274,10 +274,10 @@ func (r statefulUnpacker) cloneForRecursion() *statefulUnpacker { // UnpackAny deserializes a protobuf Any message into the provided interface, ensuring the interface is a pointer. // It applies stateful constraints such as max depth and call limits, and unpacks interfaces if required. func (r *statefulUnpacker) UnpackAny(any *Any, iface interface{}) error { - if r.maxDepth == 0 { + if r.maxDepth <= 0 { return errors.New("max depth exceeded") } - if r.maxCalls.count == 0 { + if r.maxCalls.count <= 0 { return errors.New("call limit exceeded") } // here we gracefully handle the case in which `any` itself is `nil`, which may occur in message decoding diff --git a/codec/unknownproto/unknown_fields.go b/codec/unknownproto/unknown_fields.go index 17b8f7e424..a60f2f9caa 100644 --- a/codec/unknownproto/unknown_fields.go +++ b/codec/unknownproto/unknown_fields.go @@ -54,7 +54,7 @@ func doRejectUnknownFields( if len(bz) == 0 { return hasUnknownNonCriticals, nil } - if recursionLimit == 0 { + if recursionLimit <= 0 { return false, errors.New("recursion limit reached") }