mirror of
https://github.com/Tencent/rapidjson.git
synced 2025-10-28 03:20:15 +01:00
Fixed out of bound read in FindMember() and added related new APIs
The original FindMember() may access out-of-bound of the 'const char*
name' parameter.
This commit firstly follows
f86af8c232
However, this must incur an StrLen() for name. A better API is by using
Value as the name, which provides the length of string internally. So a
set of new API are added:
operator[](const GenericValue& name)
FindMember(const GenericValue& name)
RemoveMember(const GenericValue& name)
During refactoring, it also adds an API:
RemoveMember(MemberIterator m)
which can be used for other purpose, such as removing a member while
iterating an object.
Fixes #7
This commit is contained in:
@@ -470,19 +470,31 @@ TEST(Value, Object) {
|
||||
value.SetString("Banana", 6);
|
||||
x.AddMember(name, value, allocator);
|
||||
|
||||
// Tests a member with null character
|
||||
const Value C0D("C\0D", 3);
|
||||
name.SetString(C0D.GetString(), 3);
|
||||
value.SetString("CherryD", 7);
|
||||
x.AddMember(name, value, allocator);
|
||||
|
||||
// HasMember()
|
||||
EXPECT_TRUE(x.HasMember("A"));
|
||||
EXPECT_TRUE(x.HasMember("B"));
|
||||
EXPECT_TRUE(y.HasMember("A"));
|
||||
EXPECT_TRUE(y.HasMember("B"));
|
||||
|
||||
name.SetString("C\0D", 3);
|
||||
EXPECT_TRUE(x.HasMember(name));
|
||||
EXPECT_TRUE(y.HasMember(name));
|
||||
|
||||
// operator[]
|
||||
EXPECT_STREQ("Apple", x["A"].GetString());
|
||||
EXPECT_STREQ("Banana", x["B"].GetString());
|
||||
EXPECT_STREQ("CherryD", x[C0D].GetString());
|
||||
|
||||
// const operator[]
|
||||
EXPECT_STREQ("Apple", y["A"].GetString());
|
||||
EXPECT_STREQ("Banana", y["B"].GetString());
|
||||
EXPECT_STREQ("CherryD", y[C0D].GetString());
|
||||
|
||||
// member iterator
|
||||
Value::MemberIterator itr = x.MemberBegin();
|
||||
@@ -494,6 +506,10 @@ TEST(Value, Object) {
|
||||
EXPECT_STREQ("B", itr->name.GetString());
|
||||
EXPECT_STREQ("Banana", itr->value.GetString());
|
||||
++itr;
|
||||
EXPECT_TRUE(itr != x.MemberEnd());
|
||||
EXPECT_TRUE(memcmp(itr->name.GetString(), "C\0D", 4) == 0);
|
||||
EXPECT_STREQ("CherryD", itr->value.GetString());
|
||||
++itr;
|
||||
EXPECT_FALSE(itr != x.MemberEnd());
|
||||
|
||||
// const member iterator
|
||||
@@ -506,6 +522,10 @@ TEST(Value, Object) {
|
||||
EXPECT_STREQ("B", citr->name.GetString());
|
||||
EXPECT_STREQ("Banana", citr->value.GetString());
|
||||
++citr;
|
||||
EXPECT_TRUE(citr != y.MemberEnd());
|
||||
EXPECT_TRUE(memcmp(citr->name.GetString(), "C\0D", 4) == 0);
|
||||
EXPECT_STREQ("CherryD", citr->value.GetString());
|
||||
++citr;
|
||||
EXPECT_FALSE(citr != y.MemberEnd());
|
||||
|
||||
// RemoveMember()
|
||||
@@ -515,6 +535,9 @@ TEST(Value, Object) {
|
||||
x.RemoveMember("B");
|
||||
EXPECT_FALSE(x.HasMember("B"));
|
||||
|
||||
x.RemoveMember(name);
|
||||
EXPECT_FALSE(x.HasMember(name));
|
||||
|
||||
EXPECT_TRUE(x.MemberBegin() == x.MemberEnd());
|
||||
|
||||
// SetObject()
|
||||
|
||||
Reference in New Issue
Block a user