diff options
author | Kaarle Ritvanen <kaarle.ritvanen@datakunkku.fi> | 2014-04-06 11:07:34 +0300 |
---|---|---|
committer | Kaarle Ritvanen <kaarle.ritvanen@datakunkku.fi> | 2014-04-06 21:33:15 +0300 |
commit | 30df278de3d120224f70ac801fa722ac07cffc79 (patch) | |
tree | 59b43c4f77b979f44bd0aea65e18473b3bce9d3f /aconf/model/node.lua | |
parent | c122f63a2046469788c2f7566f200950c7192dd5 (diff) | |
download | aconf-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.lua | 26 |
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 |