diff --git a/rust/upb/sys/mini_table/extension_registry.rs b/rust/upb/sys/mini_table/extension_registry.rs index 1ec16dd7cc..7cb6d847f1 100644 --- a/rust/upb/sys/mini_table/extension_registry.rs +++ b/rust/upb/sys/mini_table/extension_registry.rs @@ -27,7 +27,6 @@ pub enum ExtensionRegistryStatus { Ok = 0, DuplicateEntry = 1, OutOfMemory = 2, - InvalidExtension = 3, } // LINT.ThenChange(//depot/google3/third_party/upb/upb/mini_table/extension_registry.h) diff --git a/upb/mini_descriptor/decode.c b/upb/mini_descriptor/decode.c index 8661a5b94f..53928e4917 100644 --- a/upb/mini_descriptor/decode.c +++ b/upb/mini_descriptor/decode.c @@ -888,9 +888,15 @@ static const char* upb_MtDecoder_DoBuildMiniTableExtension( if (!ret || count != 1) return NULL; upb_MiniTableField* f = &ext->UPB_PRIVATE(field); + uint32_t fieldnum = upb_MiniTableField_Number(f); - if (upb_MiniTable_FindFieldByNumber(extendee, upb_MiniTableField_Number(f)) != - NULL) { + const uint32_t kMaxFieldNumber = (1 << 29) - 1; + if (fieldnum == 0 || + (fieldnum > kMaxFieldNumber && !upb_MiniTable_IsMessageSet(extendee))) { + upb_MdDecoder_ErrorJmp(&decoder->base, "Invalid extension field number"); + } + + if (upb_MiniTable_FindFieldByNumber(extendee, fieldnum) != NULL) { upb_MdDecoder_ErrorJmp(&decoder->base, "Extension overlaps with a known field"); } diff --git a/upb/mini_table/extension_registry.c b/upb/mini_table/extension_registry.c index 92fc440c82..a2f23ea167 100644 --- a/upb/mini_table/extension_registry.c +++ b/upb/mini_table/extension_registry.c @@ -14,7 +14,6 @@ #include "upb/hash/ext_table.h" #include "upb/mem/arena.h" #include "upb/mini_table/extension.h" -#include "upb/mini_table/internal/message.h" #include "upb/mini_table/message.h" // Must be last. @@ -42,14 +41,6 @@ UPB_API upb_ExtensionRegistryStatus upb_ExtensionRegistry_Add( uint32_t fieldnum = upb_MiniTableExtension_Number(e); const upb_MiniTable* extendee = upb_MiniTableExtension_Extendee(e); - const uint32_t kMaxFieldNumber = (1 << 29) - 1; - if (fieldnum == 0 || - (fieldnum > kMaxFieldNumber && !upb_MiniTable_IsMessageSet(extendee))) { - return kUpb_ExtensionRegistryStatus_InvalidExtension; - } - - UPB_ASSERT(upb_MiniTable_FindFieldByNumber(extendee, fieldnum) == NULL); - if (upb_exttable_lookup(&r->exts, extendee, fieldnum) != NULL) { return kUpb_ExtensionRegistryStatus_DuplicateEntry; } diff --git a/upb/mini_table/extension_registry.h b/upb/mini_table/extension_registry.h index 58e3f26c50..a6c232a862 100644 --- a/upb/mini_table/extension_registry.h +++ b/upb/mini_table/extension_registry.h @@ -63,7 +63,6 @@ typedef enum { kUpb_ExtensionRegistryStatus_Ok = 0, kUpb_ExtensionRegistryStatus_DuplicateEntry = 1, kUpb_ExtensionRegistryStatus_OutOfMemory = 2, - kUpb_ExtensionRegistryStatus_InvalidExtension = 3, } upb_ExtensionRegistryStatus; // LINT.ThenChange(//depot/google3/third_party/upb/rust/sys/mini_table/extension_registry.rs) diff --git a/upb/test/fuzz_util.cc b/upb/test/fuzz_util.cc index 8c75fcebf4..58056d1e1a 100644 --- a/upb/test/fuzz_util.cc +++ b/upb/test/fuzz_util.cc @@ -137,8 +137,9 @@ void Builder::BuildExtensions(upb_ExtensionRegistry** exts) { if (upb_ExtensionRegistry_Lookup(*exts, ext->UPB_PRIVATE(extendee), upb_MiniTableExtension_Number(ext))) continue; - upb_ExtensionRegistry_AddArray( + auto status = upb_ExtensionRegistry_AddArray( *exts, const_cast(&ext), 1); + UPB_ASSERT(status == kUpb_ExtensionRegistryStatus_Ok); } } }