don't crash when calling EnumNameXXX on sparse enum (#4982)

Make an out-of-bounds check for enum values before using them to index the
names array.  For consistency with non-sparse enums an empty string is
returned.

Fixes #4821
This commit is contained in:
Frank Benkstein
2018-10-08 23:37:35 +02:00
committed by Wouter van Oortmerssen
parent a4f9d1bfcc
commit 99fe1dc80f
6 changed files with 19 additions and 0 deletions

View File

@@ -122,6 +122,7 @@ inline const char * const *EnumNamesColor() {
}
inline const char *EnumNameColor(Color e) {
if (e < Color_Red || e > Color_Blue) return "";
const size_t index = static_cast<int>(e) - static_cast<int>(Color_Red);
return EnumNamesColor()[index];
}
@@ -157,6 +158,7 @@ inline const char * const *EnumNamesAny() {
}
inline const char *EnumNameAny(Any e) {
if (e < Any_NONE || e > Any_MyGame_Example2_Monster) return "";
const size_t index = static_cast<int>(e);
return EnumNamesAny()[index];
}

View File

@@ -45,6 +45,7 @@ inline const char * const *EnumNamesEnumInNestedNS() {
}
inline const char *EnumNameEnumInNestedNS(EnumInNestedNS e) {
if (e < EnumInNestedNS_A || e > EnumInNestedNS_C) return "";
const size_t index = static_cast<int>(e);
return EnumNamesEnumInNestedNS()[index];
}

View File

@@ -1285,6 +1285,14 @@ void EnumStringsTest() {
true);
}
void EnumNamesTest() {
TEST_EQ_STR("Red", EnumNameColor(Color_Red));
TEST_EQ_STR("Green", EnumNameColor(Color_Green));
TEST_EQ_STR("Blue", EnumNameColor(Color_Blue));
TEST_EQ_STR("", EnumNameColor(static_cast<Color>(-1)));
TEST_EQ_STR("", EnumNameColor(static_cast<Color>(1000)));
}
void IntegerOutOfRangeTest() {
TestError("table T { F:byte; } root_type T; { F:128 }",
"constant does not fit");
@@ -2058,6 +2066,7 @@ int FlatBufferTests() {
ErrorTest();
ValueTest();
EnumStringsTest();
EnumNamesTest();
IntegerOutOfRangeTest();
IntegerBoundaryTest();
UnicodeTest();

View File

@@ -69,6 +69,7 @@ inline const char * const *EnumNamesCharacter() {
}
inline const char *EnumNameCharacter(Character e) {
if (e < Character_NONE || e > Character_Unused) return "";
const size_t index = static_cast<int>(e);
return EnumNamesCharacter()[index];
}