diff options
author | Steven Barth <steven@midlink.org> | 2008-08-28 15:50:27 +0000 |
---|---|---|
committer | Steven Barth <steven@midlink.org> | 2008-08-28 15:50:27 +0000 |
commit | ba22660cb82d0f34bc1080c1fcfec539ef3634eb (patch) | |
tree | 5a38b5a192eea476b968ffbe57a159523ba2829e /libs | |
parent | b5b0914ae3d05010f8c67766af799285cb888635 (diff) |
libs/core: Add recursion detection to dumptable, serialize_data
Dumptable now writes to stderr
Diffstat (limited to 'libs')
-rw-r--r-- | libs/cbi/luasrc/cbi.lua | 14 | ||||
-rw-r--r-- | libs/core/luasrc/util.lua | 28 |
2 files changed, 34 insertions, 8 deletions
diff --git a/libs/cbi/luasrc/cbi.lua b/libs/cbi/luasrc/cbi.lua index 0a406c43e..411aa2387 100644 --- a/libs/cbi/luasrc/cbi.lua +++ b/libs/cbi/luasrc/cbi.lua @@ -616,6 +616,13 @@ function NamedSection.parse(self) AbstractSection.parse_dynamic(self, s) if luci.http.formvalue("cbi.submit") then Node.parse(self, s) + + if not self.override_scheme and self.map.scheme then + local co = self.map:get() + local stat, err = self.map.validator:validate_section(self.config, s, co) + luci.http.prepare_content("text/html") + luci.util.dumptable(err) + end end AbstractSection.parse_optionals(self, s) end @@ -705,10 +712,17 @@ function TypedSection.parse(self) end end + local co for i, k in ipairs(self:cfgsections()) do AbstractSection.parse_dynamic(self, k) if luci.http.formvalue("cbi.submit") then Node.parse(self, k) + + if not self.override_scheme and self.map.scheme then + co = co or self.map:get() + local stat, err = self.map.uvl:validate_section(self.config, k, co) + luci.util.perror(err) + end end AbstractSection.parse_optionals(self, k) end diff --git a/libs/core/luasrc/util.lua b/libs/core/luasrc/util.lua index cc15d3aeb..14bd1e79b 100644 --- a/libs/core/luasrc/util.lua +++ b/libs/core/luasrc/util.lua @@ -185,12 +185,19 @@ end -- @param t Table value to dump -- @param i Number of tabs to prepend to each line -- @return Always nil -function dumptable(t, i) +function dumptable(t, i, seen) i = i or 0 + seen = seen or setmetatable({}, {__mode="k"}) + for k,v in pairs(t) do - print(string.rep("\t", i) .. tostring(k), tostring(v)) + perror(string.rep("\t", i) .. tostring(k), tostring(v)) if type(v) == "table" then - dumptable(v, i+1) + if not seen[v] then + seen[v] = true + dumptable(v, i+1, seen) + else + perror(string.rep("\t", i) .. "*** RECURSION ***") + end end end end @@ -425,11 +432,14 @@ end -- Serialize the contents of a table value. -function _serialize_table(t) +function _serialize_table(t, seen) + assert(not seen[t], "Recursion detected.") + seen[t] = true + local data = "" for k, v in pairs(t) do - k = serialize_data(k) - v = serialize_data(v) + k = serialize_data(k, seen) + v = serialize_data(v, seen) data = data .. ( #data > 0 and ", " or "" ) .. '[' .. k .. '] = ' .. v end @@ -442,7 +452,9 @@ end -- @return String value containing the serialized code -- @see restore_data -- @see get_bytecode -function serialize_data(val) +function serialize_data(val, seen) + seen = seen or setmetatable({}, {__mode="k"}) + if val == nil then return "nil" elseif type(val) == "number" then @@ -454,7 +466,7 @@ function serialize_data(val) elseif type(val) == "function" then return string.format("loadstring(%q)", get_bytecode(val)) elseif type(val) == "table" then - return "{ " .. _serialize_table(val) .. " }" + return "{ " .. _serialize_table(val, seen) .. " }" else return '"[unhandled data type:' .. type(val) .. ']"' end |