Skip to content

Commit ae836f8

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: 952911412
1 parent cb44083 commit ae836f8

3 files changed

Lines changed: 47 additions & 12 deletions

File tree

src/google/protobuf/descriptor.cc

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -690,6 +690,21 @@ 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) << "Invalid input value.";
705+
return kCppTypeToName[cpp_type];
706+
}
707+
693708
const FieldDescriptor::CppType
694709
FieldDescriptor::kTypeToCppTypeMap[MAX_TYPE + 1] = {
695710
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: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3177,6 +3177,9 @@ TEST_F(MiscTest, StaticTypeNames) {
31773177
EXPECT_EQ(absl::string_view("sfixed64"), FD::TypeName(FD::TYPE_SFIXED64));
31783178
EXPECT_EQ(absl::string_view("sint32"), FD::TypeName(FD::TYPE_SINT32));
31793179
EXPECT_EQ(absl::string_view("sint64"), FD::TypeName(FD::TYPE_SINT64));
3180+
3181+
EXPECT_DEATH(FD::TypeName(static_cast<FD::Type>(FD::MAX_TYPE + 1)),
3182+
"Invalid input value");
31803183
}
31813184

31823185
TEST_F(MiscTest, CppTypes) {
@@ -3262,6 +3265,35 @@ TEST_F(MiscTest, StaticCppTypeNames) {
32623265
EXPECT_EQ(absl::string_view("enum"), FD::CppTypeName(FD::CPPTYPE_ENUM));
32633266
EXPECT_EQ(absl::string_view("string"), FD::CppTypeName(FD::CPPTYPE_STRING));
32643267
EXPECT_EQ(absl::string_view("message"), FD::CppTypeName(FD::CPPTYPE_MESSAGE));
3268+
3269+
EXPECT_DEATH(FD::CppTypeName(static_cast<FD::CppType>(FD::MAX_CPPTYPE + 1)),
3270+
"Invalid input value");
3271+
}
3272+
3273+
TEST_F(MiscTest, StaticTypeToCppType) {
3274+
typedef FieldDescriptor FD; // avoid ugly line wrapping
3275+
//
3276+
EXPECT_EQ(FD::CPPTYPE_DOUBLE, FD::TypeToCppType(FD::TYPE_DOUBLE));
3277+
EXPECT_EQ(FD::CPPTYPE_FLOAT, FD::TypeToCppType(FD::TYPE_FLOAT));
3278+
EXPECT_EQ(FD::CPPTYPE_INT64, FD::TypeToCppType(FD::TYPE_INT64));
3279+
EXPECT_EQ(FD::CPPTYPE_UINT64, FD::TypeToCppType(FD::TYPE_UINT64));
3280+
EXPECT_EQ(FD::CPPTYPE_INT32, FD::TypeToCppType(FD::TYPE_INT32));
3281+
EXPECT_EQ(FD::CPPTYPE_UINT64, FD::TypeToCppType(FD::TYPE_FIXED64));
3282+
EXPECT_EQ(FD::CPPTYPE_UINT32, FD::TypeToCppType(FD::TYPE_FIXED32));
3283+
EXPECT_EQ(FD::CPPTYPE_BOOL, FD::TypeToCppType(FD::TYPE_BOOL));
3284+
EXPECT_EQ(FD::CPPTYPE_STRING, FD::TypeToCppType(FD::TYPE_STRING));
3285+
EXPECT_EQ(FD::CPPTYPE_MESSAGE, FD::TypeToCppType(FD::TYPE_GROUP));
3286+
EXPECT_EQ(FD::CPPTYPE_MESSAGE, FD::TypeToCppType(FD::TYPE_MESSAGE));
3287+
EXPECT_EQ(FD::CPPTYPE_STRING, FD::TypeToCppType(FD::TYPE_BYTES));
3288+
EXPECT_EQ(FD::CPPTYPE_UINT32, FD::TypeToCppType(FD::TYPE_UINT32));
3289+
EXPECT_EQ(FD::CPPTYPE_ENUM, FD::TypeToCppType(FD::TYPE_ENUM));
3290+
EXPECT_EQ(FD::CPPTYPE_INT32, FD::TypeToCppType(FD::TYPE_SFIXED32));
3291+
EXPECT_EQ(FD::CPPTYPE_INT64, FD::TypeToCppType(FD::TYPE_SFIXED64));
3292+
EXPECT_EQ(FD::CPPTYPE_INT32, FD::TypeToCppType(FD::TYPE_SINT32));
3293+
EXPECT_EQ(FD::CPPTYPE_INT64, FD::TypeToCppType(FD::TYPE_SINT64));
3294+
3295+
EXPECT_DEATH(FD::TypeToCppType(static_cast<FD::Type>(FD::MAX_TYPE + 1)),
3296+
"Invalid input value");
32653297
}
32663298

32673299
TEST_F(MiscTest, MessageType) {

0 commit comments

Comments
 (0)