aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShadowNinja <shadowninja@minetest.net>2014-04-23 17:21:17 -0400
committerShadowNinja <shadowninja@minetest.net>2014-04-27 16:15:53 -0400
commit0d6e4ef5f38049e86457287fa638a9b81c4ff623 (patch)
tree51845b6fb332cf41884fce75ad397236fdff055a
parentf2b93b7baeaa66f5096ee326ea9c22a471ada512 (diff)
downloadminetest-0d6e4ef5f38049e86457287fa638a9b81c4ff623.tar.gz
minetest-0d6e4ef5f38049e86457287fa638a9b81c4ff623.tar.bz2
minetest-0d6e4ef5f38049e86457287fa638a9b81c4ff623.zip
Add support for function serialization to minetest.serialize
-rw-r--r--builtin/serialize.lua24
1 files changed, 20 insertions, 4 deletions
diff --git a/builtin/serialize.lua b/builtin/serialize.lua
index 165cc6731..93fffe80d 100644
--- a/builtin/serialize.lua
+++ b/builtin/serialize.lua
@@ -112,6 +112,8 @@ function minetest.serialize(x)
elseif t=="number" then return tostring(x)
elseif t=="string" then return string.format("%q", x)
elseif t=="boolean" then return x and "true" or "false"
+ elseif t=="function" then
+ return "loadstring("..string.format("%q", string.dump(x))..")"
elseif t=="table" then
local acc = { }
local idx_dumped = { }
@@ -164,17 +166,31 @@ end
-- http://stackoverflow.com/questions/5958818/loading-serialized-data-into-a-table
--
-local function stringtotable(sdata)
+local env = {
+ loadstring = loadstring,
+}
+
+local function noop() end
+
+local safe_env = {
+ loadstring = noop,
+}
+
+local function stringtotable(sdata, safe)
if sdata:byte(1) == 27 then return nil, "binary bytecode prohibited" end
local f, message = assert(loadstring(sdata))
if not f then return nil, message end
- setfenv(f, table)
+ if safe then
+ setfenv(f, safe_env)
+ else
+ setfenv(f, env)
+ end
return f()
end
-function minetest.deserialize(sdata)
+function minetest.deserialize(sdata, safe)
local table = {}
- local okay,results = pcall(stringtotable, sdata)
+ local okay, results = pcall(stringtotable, sdata, safe)
if okay then
return results
end