Add safe version of pcall and error function to luacontroller environment

This commit is contained in:
Roger 2020-05-02 13:30:50 +01:00
parent d3aedd2b98
commit b6fde13bb0
1 changed files with 16 additions and 2 deletions

View File

@ -225,12 +225,25 @@ end
local function safe_string_find(...)
if (select(4, ...)) ~= true then
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
return string.find(...)
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 tp = type(x)
if tp == "function" then
@ -430,7 +443,7 @@ end
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)
"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)
@ -452,6 +465,7 @@ local function create_environment(pos, mem, event, itbl, send_warning)
print = safe_print,
interrupt = get_interrupt(pos, itbl, send_warning),
digiline_send = get_digiline_send(pos, itbl, send_warning),
pcall = safe_pcall,
string = {
byte = string.byte,
char = string.char,