Added checking and tests for trailing garbage when decoding

pull/10/head
rxi 2018-03-10 14:28:50 +00:00
parent 19cc024df6
commit eb6e343c53
2 changed files with 9 additions and 4 deletions

View File

@ -388,7 +388,12 @@ function json.decode(str)
if type(str) ~= "string" then if type(str) ~= "string" then
error("expected argument of type string, got " .. type(str)) error("expected argument of type string, got " .. type(str))
end end
return ( parse(str, next_char(str, 1, space_chars, true)) ) local res, idx = parse(str, next_char(str, 1, space_chars, true))
idx = next_char(str, idx, space_chars, true)
if idx <= #str then
decode_error(str, idx, "trailing garbage")
end
return res
end end

View File

@ -57,7 +57,7 @@ end)
test("literals", function() test("literals", function()
assert( json.decode("true") == true ) assert( json.decode("true") == true )
assert( json.encode(true) == "true" ) assert( json.encode(true) == "true" )
assert( json.decode("false") == false ) assert( json.decode("false") == false )
assert( json.encode(false) == "false" ) assert( json.encode(false) == "false" )
assert( json.decode("null") == nil ) assert( json.decode("null") == nil )
@ -125,6 +125,8 @@ test("decode invalid", function()
'{]', '{]',
'[}', '[}',
'"a', '"a',
'10 xx',
'{}123'
} }
for i, v in ipairs(t) do for i, v in ipairs(t) do
local status = pcall(json.decode, v) local status = pcall(json.decode, v)
@ -234,5 +236,3 @@ test("encode escape", function()
assert( res == v, fmt("'%s' was not escaped properly", k) ) assert( res == v, fmt("'%s' was not escaped properly", k) )
end end
end) end)