aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthew Wild <mwild1@gmail.com>2022-11-04 12:26:10 +0000
committerMatthew Wild <mwild1@gmail.com>2022-11-04 12:26:10 +0000
commitd4daf40caa518a89e51222e6e1d9c230db02839a (patch)
treefa24a2af020d0ecdd22c6782417f8f8e8d179ecd
parent246d797f8104930ea962c6f85fc380e7a7b4e423 (diff)
downloadprosody-d4daf40caa518a89e51222e6e1d9c230db02839a.tar.gz
prosody-d4daf40caa518a89e51222e6e1d9c230db02839a.zip
util.json: Accept empty arrays with whitespace (fixes #1782)
-rw-r--r--spec/json/pass4.json8
-rw-r--r--util/json.lua19
2 files changed, 22 insertions, 5 deletions
diff --git a/spec/json/pass4.json b/spec/json/pass4.json
new file mode 100644
index 00000000..595026ad
--- /dev/null
+++ b/spec/json/pass4.json
@@ -0,0 +1,8 @@
+{
+ "one": [
+
+ ],
+ "two": [],
+ "three": [ ],
+ "four": [ ]
+}
diff --git a/util/json.lua b/util/json.lua
index a750da2e..e6704b7e 100644
--- a/util/json.lua
+++ b/util/json.lua
@@ -217,12 +217,19 @@ local function _readobject(json, index)
end
local function _readarray(json, index)
local a = {};
- local oindex = index;
while true do
- local val;
- val, index = _readvalue(json, index + 1);
+ local val, terminated;
+ val, index, terminated = _readvalue(json, index + 1, 0x5d);
if val == nil then
- if json:byte(oindex + 1) == 0x5d then return setmetatable(a, array_mt), oindex + 2; end -- "]"
+ if terminated then -- "]" found instead of value
+ if #a ~= 0 then
+ -- A non-empty array here means we processed a comma,
+ -- but it wasn't followed by a value. JSON doesn't allow
+ -- trailing commas.
+ return nil, "value expected";
+ end
+ val, index = setmetatable(a, array_mt), index+1;
+ end
return val, index;
end
t_insert(a, val);
@@ -294,7 +301,7 @@ local function _readfalse(json, index)
end
return nil, "false parse failed";
end
-function _readvalue(json, index)
+function _readvalue(json, index, terminator)
index = _skip_whitespace(json, index);
local b = json:byte(index);
-- TODO try table lookup instead of if-else?
@@ -312,6 +319,8 @@ function _readvalue(json, index)
return _readtrue(json, index);
elseif b == 0x66 then -- "f"
return _readfalse(json, index);
+ elseif b == terminator then
+ return nil, index, true;
else
return nil, "value expected";
end