mirror of
				https://github.com/SquidDev-CC/CC-Tweaked
				synced 2025-10-31 05:33:00 +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:
		| @@ -74,8 +74,7 @@ function undefine(name) | |||||||
|     details[name] = nil |     details[name] = nil | ||||||
| end | end | ||||||
|  |  | ||||||
| local function set_value(name, value) | local function set_value(name, new) | ||||||
|     local new = reserialize(value) |  | ||||||
|     local old = values[name] |     local old = values[name] | ||||||
|     if old == nil then |     if old == nil then | ||||||
|         local opt = details[name] |         local opt = details[name] | ||||||
| @@ -103,7 +102,7 @@ function set(name, value) | |||||||
|     local opt = details[name] |     local opt = details[name] | ||||||
|     if opt and opt.type then expect(2, value, opt.type) end |     if opt and opt.type then expect(2, value, opt.type) end | ||||||
|  |  | ||||||
|     set_value(name, value) |     set_value(name, reserialize(value)) | ||||||
| end | end | ||||||
|  |  | ||||||
| --- Get the value of a setting. | --- 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 |         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] |             local opt = details[k] | ||||||
|             if not opt or not opt.type or ty_v == opt.type then |             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 |         end | ||||||
|     end |     end | ||||||
|   | |||||||
| @@ -189,11 +189,16 @@ describe("The settings library", function() | |||||||
|             expect(settings.get("test.defined")):eq(nil) |             expect(settings.get("test.defined")):eq(nil) | ||||||
|         end) |         end) | ||||||
|  |  | ||||||
|         it("skips unserializable values", function() |         it("skips unserializable values (functions)", function() | ||||||
|             expect(setup_with "{ test = function() end }"):eq(true) |             expect(setup_with "{ test = function() end }"):eq(true) | ||||||
|             expect(settings.get("test")):eq(nil) |             expect(settings.get("test")):eq(nil) | ||||||
|         end) |         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() |         it("skips non-table files", function() | ||||||
|             expect(setup "not a table"):eq(false) |             expect(setup "not a table"):eq(false) | ||||||
|         end) |         end) | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Jonathan Coates
					Jonathan Coates