mirror of
https://github.com/minetest-mods/mesecons.git
synced 2025-01-29 01:20:19 +01:00
Add safe version of pcall and error function to luacontroller environment
This commit is contained in:
parent
d3aedd2b98
commit
b6fde13bb0
@ -225,12 +225,25 @@ end
|
|||||||
local function safe_string_find(...)
|
local function safe_string_find(...)
|
||||||
if (select(4, ...)) ~= true then
|
if (select(4, ...)) ~= true then
|
||||||
debug.sethook() -- Clear hook
|
debug.sethook() -- Clear hook
|
||||||
error("string.find: 'plain' (fourth parameter) must always be true in a Luacontroller")
|
error("string.find: 'plain' (fourth parameter) must always be true in a Luacontroller", 2)
|
||||||
end
|
end
|
||||||
|
|
||||||
return string.find(...)
|
return string.find(...)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- pcall can capture certain errors after the debug hook is removed.
|
||||||
|
-- Detect these errors, and propagate them.
|
||||||
|
local function safe_pcall(f, ...)
|
||||||
|
local values = {pcall(f, ...)}
|
||||||
|
local ok, err = values[1], values[2]
|
||||||
|
|
||||||
|
if not debug.gethook() then
|
||||||
|
error(string.gsub(err, "%(load%)%:.+:%s", ""), 2)
|
||||||
|
end
|
||||||
|
|
||||||
|
return unpack(values)
|
||||||
|
end
|
||||||
|
|
||||||
local function remove_functions(x)
|
local function remove_functions(x)
|
||||||
local tp = type(x)
|
local tp = type(x)
|
||||||
if tp == "function" then
|
if tp == "function" then
|
||||||
@ -430,7 +443,7 @@ end
|
|||||||
local safe_globals = {
|
local safe_globals = {
|
||||||
-- Don't add pcall/xpcall unless willing to deal with the consequences (unless very careful, incredibly likely to allow killing server indirectly)
|
-- Don't add pcall/xpcall unless willing to deal with the consequences (unless very careful, incredibly likely to allow killing server indirectly)
|
||||||
"assert", "error", "ipairs", "next", "pairs", "select",
|
"assert", "error", "ipairs", "next", "pairs", "select",
|
||||||
"tonumber", "tostring", "type", "unpack", "_VERSION"
|
"tonumber", "tostring", "type", "unpack", "_VERSION", "error"
|
||||||
}
|
}
|
||||||
|
|
||||||
local function create_environment(pos, mem, event, itbl, send_warning)
|
local function create_environment(pos, mem, event, itbl, send_warning)
|
||||||
@ -452,6 +465,7 @@ local function create_environment(pos, mem, event, itbl, send_warning)
|
|||||||
print = safe_print,
|
print = safe_print,
|
||||||
interrupt = get_interrupt(pos, itbl, send_warning),
|
interrupt = get_interrupt(pos, itbl, send_warning),
|
||||||
digiline_send = get_digiline_send(pos, itbl, send_warning),
|
digiline_send = get_digiline_send(pos, itbl, send_warning),
|
||||||
|
pcall = safe_pcall,
|
||||||
string = {
|
string = {
|
||||||
byte = string.byte,
|
byte = string.byte,
|
||||||
char = string.char,
|
char = string.char,
|
||||||
|
Loading…
Reference in New Issue
Block a user