json: fail read_string if string contains trailing garbage

Change `read_string` to fail when not the entire input has been
consumed. This avoids unexpected, even dangerous behavior (fixes #6223).

The new JSON parser adapted in #6121 also solves this problem so in
master this is a temporary fix, but should be backported to older releases.

Also adds tests for the new behavior.
This commit is contained in:
Wladimir J. van der Laan
2015-06-03 09:42:03 +02:00
parent f00b62391b
commit 4e157fc60d
2 changed files with 21 additions and 3 deletions

View File

@@ -521,12 +521,11 @@ namespace json_spirit
const spirit_namespace::parse_info< Iter_type > info =
spirit_namespace::parse( begin, end,
Json_grammer< Value_type, Iter_type >( semantic_actions ),
Json_grammer< Value_type, Iter_type >( semantic_actions ) >> spirit_namespace::end_p,
spirit_namespace::space_p );
if( !info.hit )
{
assert( false ); // in theory exception should already have been thrown
throw_error( info.stop, "error" );
}
@@ -570,7 +569,8 @@ namespace json_spirit
{
typename String_type::const_iterator begin = s.begin();
return read_range( begin, s.end(), value );
bool success = read_range( begin, s.end(), value );
return success && begin == s.end();
}
template< class Istream_type >