Skip to content

Commit fcc343e

Browse files
sbenzaquencopybara-github
authored andcommitted
Enforce bound checking in some functions in FieldDescriptor.
This enum value is user provided and they might have bugs. PiperOrigin-RevId: 953513855
1 parent 3094f87 commit fcc343e

3 files changed

Lines changed: 80 additions & 40 deletions

File tree

src/google/protobuf/descriptor.cc

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -690,6 +690,22 @@ Descriptor::WellKnownType FindWellKnownType(absl::string_view name) {
690690

691691
} // namespace
692692

693+
FieldDescriptor::CppType FieldDescriptor::TypeToCppType(Type type) {
694+
ABSL_CHECK(type >= 0 && type <= MAX_TYPE) << "Invalid input value.";
695+
return kTypeToCppTypeMap[type];
696+
}
697+
698+
absl::string_view FieldDescriptor::TypeName(Type type) {
699+
ABSL_CHECK(type >= 0 && type <= MAX_TYPE) << "Invalid input value.";
700+
return kTypeToName[type];
701+
}
702+
703+
absl::string_view FieldDescriptor::CppTypeName(CppType cpp_type) {
704+
ABSL_CHECK(cpp_type >= 0 && cpp_type <= MAX_CPPTYPE)
705+
<< "Invalid input value.";
706+
return kCppTypeToName[cpp_type];
707+
}
708+
693709
const FieldDescriptor::CppType
694710
FieldDescriptor::kTypeToCppTypeMap[MAX_TYPE + 1] = {
695711
static_cast<CppType>(0), // 0 is reserved for errors

src/google/protobuf/descriptor.h

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3212,18 +3212,6 @@ inline absl::string_view FieldDescriptor::cpp_type_name() const {
32123212
return kCppTypeToName[kTypeToCppTypeMap[type()]];
32133213
}
32143214

3215-
inline FieldDescriptor::CppType FieldDescriptor::TypeToCppType(Type type) {
3216-
return kTypeToCppTypeMap[type];
3217-
}
3218-
3219-
inline absl::string_view FieldDescriptor::TypeName(Type type) {
3220-
return kTypeToName[type];
3221-
}
3222-
3223-
inline absl::string_view FieldDescriptor::CppTypeName(CppType cpp_type) {
3224-
return kCppTypeToName[cpp_type];
3225-
}
3226-
32273215
inline bool FieldDescriptor::IsTypePackable(Type field_type) {
32283216
return (field_type != FieldDescriptor::TYPE_STRING &&
32293217
field_type != FieldDescriptor::TYPE_GROUP &&

src/google/protobuf/descriptor_unittest.cc

Lines changed: 64 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -3159,24 +3159,28 @@ TEST_F(MiscTest, StaticTypeNames) {
31593159

31603160
typedef FieldDescriptor FD; // avoid ugly line wrapping
31613161

3162-
EXPECT_EQ(absl::string_view("double"), FD::TypeName(FD::TYPE_DOUBLE));
3163-
EXPECT_EQ(absl::string_view("float"), FD::TypeName(FD::TYPE_FLOAT));
3164-
EXPECT_EQ(absl::string_view("int64"), FD::TypeName(FD::TYPE_INT64));
3165-
EXPECT_EQ(absl::string_view("uint64"), FD::TypeName(FD::TYPE_UINT64));
3166-
EXPECT_EQ(absl::string_view("int32"), FD::TypeName(FD::TYPE_INT32));
3167-
EXPECT_EQ(absl::string_view("fixed64"), FD::TypeName(FD::TYPE_FIXED64));
3168-
EXPECT_EQ(absl::string_view("fixed32"), FD::TypeName(FD::TYPE_FIXED32));
3169-
EXPECT_EQ(absl::string_view("bool"), FD::TypeName(FD::TYPE_BOOL));
3170-
EXPECT_EQ(absl::string_view("string"), FD::TypeName(FD::TYPE_STRING));
3171-
EXPECT_EQ(absl::string_view("group"), FD::TypeName(FD::TYPE_GROUP));
3172-
EXPECT_EQ(absl::string_view("message"), FD::TypeName(FD::TYPE_MESSAGE));
3173-
EXPECT_EQ(absl::string_view("bytes"), FD::TypeName(FD::TYPE_BYTES));
3174-
EXPECT_EQ(absl::string_view("uint32"), FD::TypeName(FD::TYPE_UINT32));
3175-
EXPECT_EQ(absl::string_view("enum"), FD::TypeName(FD::TYPE_ENUM));
3176-
EXPECT_EQ(absl::string_view("sfixed32"), FD::TypeName(FD::TYPE_SFIXED32));
3177-
EXPECT_EQ(absl::string_view("sfixed64"), FD::TypeName(FD::TYPE_SFIXED64));
3178-
EXPECT_EQ(absl::string_view("sint32"), FD::TypeName(FD::TYPE_SINT32));
3179-
EXPECT_EQ(absl::string_view("sint64"), FD::TypeName(FD::TYPE_SINT64));
3162+
EXPECT_EQ("ERROR", FD::TypeName(FD::Type{}));
3163+
EXPECT_EQ("double", FD::TypeName(FD::TYPE_DOUBLE));
3164+
EXPECT_EQ("float", FD::TypeName(FD::TYPE_FLOAT));
3165+
EXPECT_EQ("int64", FD::TypeName(FD::TYPE_INT64));
3166+
EXPECT_EQ("uint64", FD::TypeName(FD::TYPE_UINT64));
3167+
EXPECT_EQ("int32", FD::TypeName(FD::TYPE_INT32));
3168+
EXPECT_EQ("fixed64", FD::TypeName(FD::TYPE_FIXED64));
3169+
EXPECT_EQ("fixed32", FD::TypeName(FD::TYPE_FIXED32));
3170+
EXPECT_EQ("bool", FD::TypeName(FD::TYPE_BOOL));
3171+
EXPECT_EQ("string", FD::TypeName(FD::TYPE_STRING));
3172+
EXPECT_EQ("group", FD::TypeName(FD::TYPE_GROUP));
3173+
EXPECT_EQ("message", FD::TypeName(FD::TYPE_MESSAGE));
3174+
EXPECT_EQ("bytes", FD::TypeName(FD::TYPE_BYTES));
3175+
EXPECT_EQ("uint32", FD::TypeName(FD::TYPE_UINT32));
3176+
EXPECT_EQ("enum", FD::TypeName(FD::TYPE_ENUM));
3177+
EXPECT_EQ("sfixed32", FD::TypeName(FD::TYPE_SFIXED32));
3178+
EXPECT_EQ("sfixed64", FD::TypeName(FD::TYPE_SFIXED64));
3179+
EXPECT_EQ("sint32", FD::TypeName(FD::TYPE_SINT32));
3180+
EXPECT_EQ("sint64", FD::TypeName(FD::TYPE_SINT64));
3181+
3182+
EXPECT_DEATH((void)FD::TypeName(static_cast<FD::Type>(FD::MAX_TYPE + 1)),
3183+
"Invalid input value");
31803184
}
31813185

31823186
TEST_F(MiscTest, CppTypes) {
@@ -3252,16 +3256,48 @@ TEST_F(MiscTest, StaticCppTypeNames) {
32523256

32533257
typedef FieldDescriptor FD; // avoid ugly line wrapping
32543258

3255-
EXPECT_EQ(absl::string_view("int32"), FD::CppTypeName(FD::CPPTYPE_INT32));
3256-
EXPECT_EQ(absl::string_view("int64"), FD::CppTypeName(FD::CPPTYPE_INT64));
3257-
EXPECT_EQ(absl::string_view("uint32"), FD::CppTypeName(FD::CPPTYPE_UINT32));
3258-
EXPECT_EQ(absl::string_view("uint64"), FD::CppTypeName(FD::CPPTYPE_UINT64));
3259-
EXPECT_EQ(absl::string_view("double"), FD::CppTypeName(FD::CPPTYPE_DOUBLE));
3260-
EXPECT_EQ(absl::string_view("float"), FD::CppTypeName(FD::CPPTYPE_FLOAT));
3261-
EXPECT_EQ(absl::string_view("bool"), FD::CppTypeName(FD::CPPTYPE_BOOL));
3262-
EXPECT_EQ(absl::string_view("enum"), FD::CppTypeName(FD::CPPTYPE_ENUM));
3263-
EXPECT_EQ(absl::string_view("string"), FD::CppTypeName(FD::CPPTYPE_STRING));
3264-
EXPECT_EQ(absl::string_view("message"), FD::CppTypeName(FD::CPPTYPE_MESSAGE));
3259+
EXPECT_EQ("ERROR", FD::CppTypeName(FD::CppType{}));
3260+
EXPECT_EQ("int32", FD::CppTypeName(FD::CPPTYPE_INT32));
3261+
EXPECT_EQ("int64", FD::CppTypeName(FD::CPPTYPE_INT64));
3262+
EXPECT_EQ("uint32", FD::CppTypeName(FD::CPPTYPE_UINT32));
3263+
EXPECT_EQ("uint64", FD::CppTypeName(FD::CPPTYPE_UINT64));
3264+
EXPECT_EQ("double", FD::CppTypeName(FD::CPPTYPE_DOUBLE));
3265+
EXPECT_EQ("float", FD::CppTypeName(FD::CPPTYPE_FLOAT));
3266+
EXPECT_EQ("bool", FD::CppTypeName(FD::CPPTYPE_BOOL));
3267+
EXPECT_EQ("enum", FD::CppTypeName(FD::CPPTYPE_ENUM));
3268+
EXPECT_EQ("string", FD::CppTypeName(FD::CPPTYPE_STRING));
3269+
EXPECT_EQ("message", FD::CppTypeName(FD::CPPTYPE_MESSAGE));
3270+
3271+
EXPECT_DEATH(
3272+
(void)FD::CppTypeName(static_cast<FD::CppType>(FD::MAX_CPPTYPE + 1)),
3273+
"Invalid input value");
3274+
}
3275+
3276+
TEST_F(MiscTest, StaticTypeToCppType) {
3277+
typedef FieldDescriptor FD; // avoid ugly line wrapping
3278+
//
3279+
EXPECT_EQ(FD::CppType{}, FD::TypeToCppType(FD::Type{}));
3280+
EXPECT_EQ(FD::CPPTYPE_DOUBLE, FD::TypeToCppType(FD::TYPE_DOUBLE));
3281+
EXPECT_EQ(FD::CPPTYPE_FLOAT, FD::TypeToCppType(FD::TYPE_FLOAT));
3282+
EXPECT_EQ(FD::CPPTYPE_INT64, FD::TypeToCppType(FD::TYPE_INT64));
3283+
EXPECT_EQ(FD::CPPTYPE_UINT64, FD::TypeToCppType(FD::TYPE_UINT64));
3284+
EXPECT_EQ(FD::CPPTYPE_INT32, FD::TypeToCppType(FD::TYPE_INT32));
3285+
EXPECT_EQ(FD::CPPTYPE_UINT64, FD::TypeToCppType(FD::TYPE_FIXED64));
3286+
EXPECT_EQ(FD::CPPTYPE_UINT32, FD::TypeToCppType(FD::TYPE_FIXED32));
3287+
EXPECT_EQ(FD::CPPTYPE_BOOL, FD::TypeToCppType(FD::TYPE_BOOL));
3288+
EXPECT_EQ(FD::CPPTYPE_STRING, FD::TypeToCppType(FD::TYPE_STRING));
3289+
EXPECT_EQ(FD::CPPTYPE_MESSAGE, FD::TypeToCppType(FD::TYPE_GROUP));
3290+
EXPECT_EQ(FD::CPPTYPE_MESSAGE, FD::TypeToCppType(FD::TYPE_MESSAGE));
3291+
EXPECT_EQ(FD::CPPTYPE_STRING, FD::TypeToCppType(FD::TYPE_BYTES));
3292+
EXPECT_EQ(FD::CPPTYPE_UINT32, FD::TypeToCppType(FD::TYPE_UINT32));
3293+
EXPECT_EQ(FD::CPPTYPE_ENUM, FD::TypeToCppType(FD::TYPE_ENUM));
3294+
EXPECT_EQ(FD::CPPTYPE_INT32, FD::TypeToCppType(FD::TYPE_SFIXED32));
3295+
EXPECT_EQ(FD::CPPTYPE_INT64, FD::TypeToCppType(FD::TYPE_SFIXED64));
3296+
EXPECT_EQ(FD::CPPTYPE_INT32, FD::TypeToCppType(FD::TYPE_SINT32));
3297+
EXPECT_EQ(FD::CPPTYPE_INT64, FD::TypeToCppType(FD::TYPE_SINT64));
3298+
3299+
EXPECT_DEATH((void)FD::TypeToCppType(static_cast<FD::Type>(FD::MAX_TYPE + 1)),
3300+
"Invalid input value");
32653301
}
32663302

32673303
TEST_F(MiscTest, MessageType) {

0 commit comments

Comments
 (0)