From 8ceca4cb584ac107ef0ee47925f2e7a84eaa24cd Mon Sep 17 00:00:00 2001 From: Ada Zhang Date: Fri, 29 May 2026 09:52:00 -0700 Subject: [PATCH] upb: Adds a new error code `kUpb_ErrorCode_MaxDepthExceeded`. PiperOrigin-RevId: 923465700 --- rust/upb/sys/wire/wire.rs | 12 ++++++------ upb/base/error_handler.h | 1 + upb/message/convert.c | 3 +-- upb/wire/decode.h | 16 ++++++++++------ upb/wire/encode.h | 13 +++++++------ 5 files changed, 25 insertions(+), 20 deletions(-) diff --git a/rust/upb/sys/wire/wire.rs b/rust/upb/sys/wire/wire.rs index e50178104c..6e62969b59 100644 --- a/rust/upb/sys/wire/wire.rs +++ b/rust/upb/sys/wire/wire.rs @@ -21,9 +21,9 @@ use sys::mini_table::mini_table::RawMiniTable; pub enum EncodeStatus { Ok = 0, OutOfMemory = 1, - MaxDepthExceeded = 2, - MissingRequired = 3, - MaxSizeExceeded = 4, + MaxDepthExceeded = 3, + MissingRequired = 10, + MaxSizeExceeded = 11, } // LINT.ThenChange() @@ -35,9 +35,9 @@ pub enum DecodeStatus { Ok = 0, OutOfMemory = 1, Malformed = 2, - BadUtf8 = 3, - MaxDepthExceeded = 4, - MissingRequired = 5, + MaxDepthExceeded = 3, + BadUtf8 = 10, + MissingRequired = 11, } // LINT.ThenChange() diff --git a/upb/base/error_handler.h b/upb/base/error_handler.h index 24c95d0c2a..2ad746c3d0 100644 --- a/upb/base/error_handler.h +++ b/upb/base/error_handler.h @@ -56,6 +56,7 @@ typedef enum { kUpb_ErrorCode_Ok = 0, kUpb_ErrorCode_OutOfMemory = 1, kUpb_ErrorCode_Malformed = 2, + kUpb_ErrorCode_MaxDepthExceeded = 3, } upb_ErrorCode; typedef struct { diff --git a/upb/message/convert.c b/upb/message/convert.c index 507279ea94..5999d99288 100644 --- a/upb/message/convert.c +++ b/upb/message/convert.c @@ -490,8 +490,7 @@ static void upb_Message_ConvertInternal(upb_Converter* c, upb_Message* dst, int depth) { UPB_ASSERT(dst != NULL); if (--depth == 0) { - // TODO:b/494593478 - Add a new error code for max depth exceeded. - upb_ErrorHandler_ThrowError(&c->err, kUpb_ErrorCode_Malformed); + upb_ErrorHandler_ThrowError(&c->err, kUpb_ErrorCode_MaxDepthExceeded); } const upb_MiniTableField* dst_f = NULL; diff --git a/upb/wire/decode.h b/upb/wire/decode.h index e11da1ad12..d8162c4acd 100644 --- a/upb/wire/decode.h +++ b/upb/wire/decode.h @@ -13,6 +13,7 @@ #include #include +#include "upb/base/error_handler.h" #include "upb/mem/arena.h" #include "upb/message/message.h" #include "upb/mini_table/extension_registry.h" @@ -83,16 +84,19 @@ UPB_INLINE int upb_Decode_LimitDepth(uint32_t decode_options, uint32_t limit) { // LINT.IfChange typedef enum { - kUpb_DecodeStatus_Ok = 0, - kUpb_DecodeStatus_OutOfMemory = 1, // Arena alloc failed - kUpb_DecodeStatus_Malformed = 2, // Wire format was corrupt - kUpb_DecodeStatus_BadUtf8 = 3, // String field had bad UTF-8 + kUpb_DecodeStatus_Ok = kUpb_ErrorCode_Ok, + kUpb_DecodeStatus_OutOfMemory = + kUpb_ErrorCode_OutOfMemory, // Arena alloc failed + kUpb_DecodeStatus_Malformed = + kUpb_ErrorCode_Malformed, // Wire format was corrupt kUpb_DecodeStatus_MaxDepthExceeded = - 4, // Exceeded upb_DecodeOptions_MaxDepth + kUpb_ErrorCode_MaxDepthExceeded, // Exceeded upb_DecodeOptions_MaxDepth + + kUpb_DecodeStatus_BadUtf8 = 10, // String field had bad UTF-8 // kUpb_DecodeOption_CheckRequired failed (see above), but the parse otherwise // succeeded. - kUpb_DecodeStatus_MissingRequired = 5, + kUpb_DecodeStatus_MissingRequired = 11, } upb_DecodeStatus; // LINT.ThenChange(//depot/google3/third_party/upb/rust/sys/wire/wire.rs:decode_status) diff --git a/upb/wire/encode.h b/upb/wire/encode.h index 6867587d92..3b94d0bf81 100644 --- a/upb/wire/encode.h +++ b/upb/wire/encode.h @@ -13,6 +13,7 @@ #include #include +#include "upb/base/error_handler.h" #include "upb/mem/arena.h" #include "upb/message/message.h" #include "upb/mini_table/message.h" @@ -43,16 +44,16 @@ enum { // LINT.IfChange typedef enum { - kUpb_EncodeStatus_Ok = 0, - kUpb_EncodeStatus_OutOfMemory = 1, // Arena alloc failed - kUpb_EncodeStatus_MaxDepthExceeded = 2, - + kUpb_EncodeStatus_Ok = kUpb_ErrorCode_Ok, + kUpb_EncodeStatus_OutOfMemory = + kUpb_ErrorCode_OutOfMemory, // Arena alloc failed // One or more required fields are missing. Only returned if // kUpb_EncodeOption_CheckRequired is set. - kUpb_EncodeStatus_MissingRequired = 3, + kUpb_EncodeStatus_MaxDepthExceeded = kUpb_ErrorCode_MaxDepthExceeded, + kUpb_EncodeStatus_MissingRequired = 10, // The message is larger than protobuf's 2GB size limit. - kUpb_EncodeStatus_MaxSizeExceeded = 4, + kUpb_EncodeStatus_MaxSizeExceeded = 11, } upb_EncodeStatus; // LINT.ThenChange(//depot/google3/third_party/upb/rust/sys/wire/wire.rs:encode_status)