summaryrefslogtreecommitdiffstats
path: root/aconf/model/node.lua
diff options
context:
space:
mode:
authorKaarle Ritvanen <kaarle.ritvanen@datakunkku.fi>2014-04-06 11:07:34 +0300
committerKaarle Ritvanen <kaarle.ritvanen@datakunkku.fi>2014-04-06 21:33:15 +0300
commit30df278de3d120224f70ac801fa722ac07cffc79 (patch)
tree59b43c4f77b979f44bd0aea65e18473b3bce9d3f /aconf/model/node.lua
parentc122f63a2046469788c2f7566f200950c7192dd5 (diff)
downloadaconf-30df278de3d120224f70ac801fa722ac07cffc79.tar.bz2
aconf-30df278de3d120224f70ac801fa722ac07cffc79.tar.xz
model: validate list indices
disallow sparse lists
Diffstat (limited to 'aconf/model/node.lua')
-rw-r--r--aconf/model/node.lua26
1 files changed, 21 insertions, 5 deletions
diff --git a/aconf/model/node.lua b/aconf/model/node.lua
index 013b1bb..bdf8311 100644
--- a/aconf/model/node.lua
+++ b/aconf/model/node.lua
@@ -351,24 +351,40 @@ function M.List:init(context, params)
mt._save = mt.save
+ local function check_index(i, max)
+ if type(i) ~= 'number' or math.floor(i) ~= i or i < 1 or i > max then
+ raise(mt.path, 'Invalid list index: '..i)
+ end
+ end
+
function mt.save(k, v)
- assert(type(k) == 'number')
+ local len = #mt.members()
+
if v == nil then
+ check_index(k, len)
mt.check_removable(k)
- local len = #mt.members()
while k < len do
tmt._save(k, tmt.load(k + 1, {dereference=false}))
k = k + 1
end
tmt._save(len)
- else mt._save(k, v) end
+
+ else
+ check_index(k, len + 1)
+ mt._save(k, v)
+ end
end
function mt.insert(v, i)
assert(v ~= nil)
- mt.check_permission('create')
+
local len = #mt.members()
- if not i then i = len + 1 end
+ local max = len + 1
+ if i then check_index(i, max)
+ else i = max end
+
+ mt.check_permission('create')
+
for j = len,i,-1 do
tmt._save(j + 1, tmt.load(j, {dereference=false}))
end