Skip to content

Commit 38abdbf

Browse files
committed
Fix array access checks, more tests
1 parent ad8ac3f commit 38abdbf

File tree

2 files changed

+42
-27
lines changed

2 files changed

+42
-27
lines changed

include/tao/json/value.hh

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -418,13 +418,13 @@ namespace tao
418418
const basic_value * v = this;
419419
const char * p = k.value().c_str();
420420
const char * e = p + k.value().size();
421-
while( p != e ) {
422-
switch( v->m_type ) {
421+
while ( p != e ) {
422+
switch ( v->m_type ) {
423423
case json::type::ARRAY:
424424
{
425425
const auto t = internal::next_json_pointer_token( ++p, e );
426-
if( t == "-" ) {
427-
throw std::out_of_range( "unable to resolve json_pointer" );
426+
if ( ( t.find_first_not_of( "0123456789" ) != std::string::npos ) || ( t.size() > 1 && t[ 0 ] == '0' ) ) {
427+
throw std::out_of_range( "unable to resolve json_pointer, invalid token for const array access '" + t + '\'' );
428428
}
429429
v = &v->at( std::stoull( t ) );
430430
}

src/test/json/json_pointer.cc

Lines changed: 38 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ namespace tao
2626
// create test vector
2727
const std::string ezp( "o\0p", 3 );
2828
const std::string ezq( "o\0q", 3 );
29-
const value v {
29+
const value cv {
3030
{ "foo", value::array( { "bar", "baz" } ) },
3131
{ "", 0 },
3232
{ "a/b", 1 },
@@ -38,31 +38,46 @@ namespace tao
3838
{ " ", 7 },
3939
{ "m~n", 8 },
4040
{ ezp, 9 },
41-
{ ezq, 10 }
41+
{ ezq, 10 },
42+
{ "-", 11 }
4243
};
4344

4445
// check access
45-
TEST_ASSERT( v.at( ""_json_pointer ) == v );
46-
TEST_ASSERT( v.at( "/foo"_json_pointer ) == value::array( { "bar", "baz" } ) );
47-
TEST_ASSERT( v.at( "/foo/0"_json_pointer ) == "bar" );
48-
TEST_ASSERT( v.at( "/"_json_pointer ) == 0 );
49-
TEST_ASSERT( v.at( "/a~1b"_json_pointer ) == 1 );
50-
TEST_ASSERT( v.at( "/c%d"_json_pointer ) == 2 );
51-
TEST_ASSERT( v.at( "/e^f"_json_pointer ) == 3 );
52-
TEST_ASSERT( v.at( "/g|h"_json_pointer ) == 4 );
53-
TEST_ASSERT( v.at( "/i\\j"_json_pointer ) == 5 );
54-
TEST_ASSERT( v.at( "/k\"l"_json_pointer ) == 6 );
55-
TEST_ASSERT( v.at( "/ "_json_pointer ) == 7 );
56-
TEST_ASSERT( v.at( "/m~0n"_json_pointer ) == 8 );
57-
TEST_ASSERT( v.at( "/o\0p"_json_pointer ) == 9 );
58-
TEST_ASSERT( v.at( "/o\0q"_json_pointer ) == 10 );
59-
60-
TEST_THROWS( v.at( "/o\0r"_json_pointer ) );
61-
62-
TEST_THROWS( v.at( "/bar"_json_pointer ) );
63-
TEST_THROWS( v.at( "/foo/bar"_json_pointer ) );
64-
TEST_THROWS( v.at( "//"_json_pointer ) );
65-
TEST_THROWS( v.at( "/-"_json_pointer ) );
46+
TEST_ASSERT( cv.at( ""_json_pointer ) == cv );
47+
48+
TEST_ASSERT( cv.at( "/foo"_json_pointer ) == value::array( { "bar", "baz" } ) );
49+
TEST_THROWS( cv.at( "/bar"_json_pointer ) );
50+
51+
TEST_ASSERT( cv.at( "/foo/0"_json_pointer ) == "bar" );
52+
TEST_ASSERT( cv.at( "/foo/1"_json_pointer ) == "baz" );
53+
TEST_THROWS( cv.at( "/foo/2"_json_pointer ) );
54+
55+
TEST_THROWS( cv.at( "/foo/00"_json_pointer ) );
56+
TEST_THROWS( cv.at( "/foo/01"_json_pointer ) );
57+
TEST_THROWS( cv.at( "/foo/0 "_json_pointer ) );
58+
TEST_THROWS( cv.at( "/foo/ 0"_json_pointer ) );
59+
TEST_THROWS( cv.at( "/foo/1 "_json_pointer ) );
60+
TEST_THROWS( cv.at( "/foo/ 1"_json_pointer ) );
61+
TEST_THROWS( cv.at( "/foo/-"_json_pointer ) );
62+
TEST_THROWS( cv.at( "/foo/bar"_json_pointer ) );
63+
64+
TEST_ASSERT( cv.at( "/"_json_pointer ) == 0 );
65+
TEST_THROWS( cv.at( "//"_json_pointer ) );
66+
67+
TEST_ASSERT( cv.at( "/a~1b"_json_pointer ) == 1 );
68+
TEST_ASSERT( cv.at( "/c%d"_json_pointer ) == 2 );
69+
TEST_ASSERT( cv.at( "/e^f"_json_pointer ) == 3 );
70+
TEST_ASSERT( cv.at( "/g|h"_json_pointer ) == 4 );
71+
TEST_ASSERT( cv.at( "/i\\j"_json_pointer ) == 5 );
72+
TEST_ASSERT( cv.at( "/k\"l"_json_pointer ) == 6 );
73+
TEST_ASSERT( cv.at( "/ "_json_pointer ) == 7 );
74+
TEST_ASSERT( cv.at( "/m~0n"_json_pointer ) == 8 );
75+
76+
TEST_ASSERT( cv.at( "/o\0p"_json_pointer ) == 9 );
77+
TEST_ASSERT( cv.at( "/o\0q"_json_pointer ) == 10 );
78+
TEST_THROWS( cv.at( "/o\0r"_json_pointer ) );
79+
80+
TEST_ASSERT( cv.at( "/-"_json_pointer ) == 11 );
6681
}
6782

6883
} // json

0 commit comments

Comments
 (0)