mirror of
https://github.com/SquidDev-CC/CC-Tweaked
synced 2024-12-14 12:10:30 +00:00
Be more rigorous in checking for invalid values in settings.load
If someone had a recursive table (created with an IIFE), then we'd throw an error inside reserialize. We now catch this error and silently drop the value. I'm not thrilled by this behaviour - there's an argument we should return false instead - but it's consistent with what we currently do. Closes #1337.
This commit is contained in:
parent
a5bda7454a
commit
41c83988a1
@ -74,8 +74,7 @@ function undefine(name)
|
||||
details[name] = nil
|
||||
end
|
||||
|
||||
local function set_value(name, value)
|
||||
local new = reserialize(value)
|
||||
local function set_value(name, new)
|
||||
local old = values[name]
|
||||
if old == nil then
|
||||
local opt = details[name]
|
||||
@ -103,7 +102,7 @@ function set(name, value)
|
||||
local opt = details[name]
|
||||
if opt and opt.type then expect(2, value, opt.type) end
|
||||
|
||||
set_value(name, value)
|
||||
set_value(name, reserialize(value))
|
||||
end
|
||||
|
||||
--- Get the value of a setting.
|
||||
@ -214,7 +213,9 @@ function load(sPath)
|
||||
if type(k) == "string" and (ty_v == "string" or ty_v == "number" or ty_v == "boolean" or ty_v == "table") then
|
||||
local opt = details[k]
|
||||
if not opt or not opt.type or ty_v == opt.type then
|
||||
set_value(k, v)
|
||||
-- This may fail if the table is recursive (or otherwise cannot be serialized).
|
||||
local ok, v = pcall(reserialize, v)
|
||||
if ok then set_value(k, v) end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
@ -189,11 +189,16 @@ describe("The settings library", function()
|
||||
expect(settings.get("test.defined")):eq(nil)
|
||||
end)
|
||||
|
||||
it("skips unserializable values", function()
|
||||
it("skips unserializable values (functions)", function()
|
||||
expect(setup_with "{ test = function() end }"):eq(true)
|
||||
expect(settings.get("test")):eq(nil)
|
||||
end)
|
||||
|
||||
it("skips unserializable values (recursive tables)", function()
|
||||
expect(setup_with "{ test = (function() local x = {} x.x = x return x end)() }"):eq(true)
|
||||
expect(settings.get("test")):eq(nil)
|
||||
end)
|
||||
|
||||
it("skips non-table files", function()
|
||||
expect(setup "not a table"):eq(false)
|
||||
end)
|
||||
|
Loading…
Reference in New Issue
Block a user