diff options
author | Mark Pulford <mark@kyne.com.au> | 2012-01-17 18:25:33 +0400 |
---|---|---|
committer | Mark Pulford <mark@kyne.com.au> | 2012-03-04 12:24:35 +0400 |
commit | 0c6f2e488e17528ae42481d09879fd36551000e9 (patch) | |
tree | aa12aab7e8619df8235eccb2c46368d822d45c33 | |
parent | 8faf8490e518315a8eff17a76b019debe48104b4 (diff) |
Add depth/index to decode depth error message
Include depth and character index when throwing decode nesting errors.
Pre-emptively add a test decoding a massively nested JSON array. Lua
stack overflow faults are unlikely to occur on simple data structures.
Valgrind can highlight stack allocation bugs with complicated JSON even
if the test succeeds.
-rw-r--r-- | lua_cjson.c | 5 | ||||
-rwxr-xr-x | tests/test.lua | 7 |
2 files changed, 8 insertions, 4 deletions
diff --git a/lua_cjson.c b/lua_cjson.c index 4a2ce0f..b64ed62 100644 --- a/lua_cjson.c +++ b/lua_cjson.c @@ -1034,7 +1034,7 @@ static void json_next_number_token(json_parse_t *json, json_token_t *token) */ static void json_next_token(json_parse_t *json, json_token_t *token) { - json_token_type_t *ch2token = json->cfg->ch2token; + const json_token_type_t *ch2token = json->cfg->ch2token; int ch; /* Eat whitespace. */ @@ -1149,7 +1149,8 @@ static void json_decode_descend(lua_State *l, json_parse_t *json, int slots) } strbuf_free(json->tmp); - luaL_error(l, "Too many nested data structures"); + luaL_error(l, "Found too many nested data structures (%d) at character %d", + json->current_depth, json->ptr - json->data); } static void json_parse_object_context(lua_State *l, json_parse_t *json) diff --git a/tests/test.lua b/tests/test.lua index 4c00453..8bb5b95 100755 --- a/tests/test.lua +++ b/tests/test.lua @@ -162,15 +162,18 @@ local cjson_tests = { true, { {{{{{ "nested" }}}}} } }, { "Decode array over nested limit [throw error]", json.decode, { '[[[[[[ "nested" ]]]]]]' }, - false, { "Too many nested data structures" } }, + false, { "Found too many nested data structures (6) at character 6" } }, { "Decode object at nested limit", json.decode, { '{"a":{"b":{"c":{"d":{"e":"nested"}}}}}' }, true, { {a={b={c={d={e="nested"}}}}} } }, { "Decode object over nested limit [throw error]", json.decode, { '{"a":{"b":{"c":{"d":{"e":{"f":"nested"}}}}}}' }, - false, { "Too many nested data structures" } }, + false, { "Found too many nested data structures (6) at character 26" } }, { "Set decode_max_depth(1000)", json.decode_max_depth, { 1000 }, true, { 1000 } }, + { "Decode deeply nested array [throw error]", + json.decode, { string.rep("[", 1100) .. '1100' .. string.rep("]", 1100)}, + false, { "Found too many nested data structures (1001) at character 1001" } }, -- Test encoding nested tables { "Set encode_max_depth(5)", |