diff options
author | ShadowNinja <shadowninja@minetest.net> | 2014-04-23 17:21:17 -0400 |
---|---|---|
committer | ShadowNinja <shadowninja@minetest.net> | 2014-04-27 16:15:53 -0400 |
commit | 0d6e4ef5f38049e86457287fa638a9b81c4ff623 (patch) | |
tree | 51845b6fb332cf41884fce75ad397236fdff055a | |
parent | f2b93b7baeaa66f5096ee326ea9c22a471ada512 (diff) | |
download | minetest-0d6e4ef5f38049e86457287fa638a9b81c4ff623.tar.gz minetest-0d6e4ef5f38049e86457287fa638a9b81c4ff623.tar.bz2 minetest-0d6e4ef5f38049e86457287fa638a9b81c4ff623.zip |
Add support for function serialization to minetest.serialize
-rw-r--r-- | builtin/serialize.lua | 24 |
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 |