Skip to content

Commit

Permalink
GenericValue::FindMember: avoid buffer overflow
Browse files Browse the repository at this point in the history
In GenericValue::FindMember, the 'name' argument may be dereferenced
beyond its length, depending on the lengths of the currently existing
member names in the JSON object.

Instead of unconditionally dereferencing the given string, check for
its length first and skip comparisons for different lengths.

Fixes http://code.google.com/p/rapidjson/issues/detail?id=108.
  • Loading branch information
pah committed Apr 23, 2014
1 parent 4c0265c commit f86af8c
Showing 1 changed file with 2 additions and 1 deletion.
3 changes: 2 additions & 1 deletion include/rapidjson/document.h
Original file line number Diff line number Diff line change
Expand Up @@ -289,9 +289,10 @@ class GenericValue {
RAPIDJSON_ASSERT(name);
RAPIDJSON_ASSERT(IsObject());

SizeType len = internal::StrLen(name);
Object& o = data_.o;
for (Member* member = o.members; member != data_.o.members + data_.o.size; ++member)
if (name[member->name.data_.s.length] == '\0' && memcmp(member->name.data_.s.str, name, member->name.data_.s.length * sizeof(Ch)) == 0)
if (member->name.data_.s.length == len && memcmp(member->name.data_.s.str, name, len * sizeof(Ch)) == 0)
return member;

return 0;
Expand Down

0 comments on commit f86af8c

Please sign in to comment.