From f3ad75691aea30d2d68aab19fbfa9031409c39d7 Mon Sep 17 00:00:00 2001 From: red-001 Date: Fri, 30 Jun 2017 19:14:39 +0100 Subject: Create a filesystem abstraction layer for CSM and only allow accessing files that are scanned into it. (#5965) * Load client-side mods into memory before executing them. This removes the remaining filesystem access that client-sided mods had and it will hopefully make then more secure. * Lua Virtual filesystem: don't load the files into memory just scan the filenames into memory. * Fix the issues with backtrace * fix most of the issues * fix code style. * add a comment --- src/script/common/c_internal.cpp | 34 +++------------------------------- src/script/common/c_internal.h | 4 ++-- 2 files changed, 5 insertions(+), 33 deletions(-) (limited to 'src/script/common') diff --git a/src/script/common/c_internal.cpp b/src/script/common/c_internal.cpp index b349f9dd1..0b388e383 100644 --- a/src/script/common/c_internal.cpp +++ b/src/script/common/c_internal.cpp @@ -24,37 +24,9 @@ with this program; if not, write to the Free Software Foundation, Inc., std::string script_get_backtrace(lua_State *L) { - std::string s; - lua_getglobal(L, "debug"); - if(lua_istable(L, -1)){ - lua_getfield(L, -1, "traceback"); - if(lua_isfunction(L, -1)) { - lua_call(L, 0, 1); - if(lua_isstring(L, -1)){ - s = lua_tostring(L, -1); - } - } - lua_pop(L, 1); - } - lua_pop(L, 1); - return s; -} - -int script_error_handler(lua_State *L) { - lua_getglobal(L, "debug"); - if (!lua_istable(L, -1)) { - lua_pop(L, 1); - return 1; - } - lua_getfield(L, -1, "traceback"); - if (!lua_isfunction(L, -1)) { - lua_pop(L, 2); - return 1; - } - lua_pushvalue(L, 1); - lua_pushinteger(L, 2); - lua_call(L, 2, 1); - return 1; + lua_rawgeti(L, LUA_REGISTRYINDEX, CUSTOM_RIDX_BACKTRACE); + lua_call(L, 0, 1); + return luaL_checkstring(L, -1); } int script_exception_wrapper(lua_State *L, lua_CFunction f) diff --git a/src/script/common/c_internal.h b/src/script/common/c_internal.h index fc59b0e2e..b77f0a7c3 100644 --- a/src/script/common/c_internal.h +++ b/src/script/common/c_internal.h @@ -53,11 +53,11 @@ extern "C" { #define CUSTOM_RIDX_SCRIPTAPI (CUSTOM_RIDX_BASE) #define CUSTOM_RIDX_GLOBALS_BACKUP (CUSTOM_RIDX_BASE + 1) #define CUSTOM_RIDX_CURRENT_MOD_NAME (CUSTOM_RIDX_BASE + 2) -#define CUSTOM_RIDX_ERROR_HANDLER (CUSTOM_RIDX_BASE + 3) +#define CUSTOM_RIDX_BACKTRACE (CUSTOM_RIDX_BASE + 3) // Pushes the error handler onto the stack and returns its index #define PUSH_ERROR_HANDLER(L) \ - (lua_rawgeti((L), LUA_REGISTRYINDEX, CUSTOM_RIDX_ERROR_HANDLER), lua_gettop((L))) + (lua_rawgeti((L), LUA_REGISTRYINDEX, CUSTOM_RIDX_BACKTRACE), lua_gettop((L))) #define PCALL_RESL(L, RES) do { \ int result_ = (RES); \ -- cgit v1.2.3