int ScriptApiSecurity::sl_io_open(lua_State *L) { bool with_mode = lua_gettop(L) > 1; luaL_checktype(L, 1, LUA_TSTRING); const char *path = lua_tostring(L, 1); bool write_requested = false; if (with_mode) { luaL_checktype(L, 2, LUA_TSTRING); const char *mode = lua_tostring(L, 2); write_requested = strchr(mode, 'w') != NULL || strchr(mode, '+') != NULL || strchr(mode, 'a') != NULL; } CHECK_SECURE_PATH_INTERNAL(L, path, write_requested, NULL); push_original(L, "io", "open"); lua_pushvalue(L, 1); if (with_mode) { lua_pushvalue(L, 2); } lua_call(L, with_mode ? 2 : 1, 2); return 2; }
int ScriptApiSecurity::sl_os_remove(lua_State *L) { luaL_checktype(L, 1, LUA_TSTRING); const char *path = lua_tostring(L, 1); CHECK_SECURE_PATH(L, path); push_original(L, "os", "remove"); lua_pushvalue(L, 1); lua_call(L, 1, 2); return 2; }
int ScriptApiSecurity::sl_io_output(lua_State *L) { if (lua_isstring(L, 1)) { const char *path = lua_tostring(L, 1); CHECK_SECURE_PATH(L, path); } push_original(L, "io", "output"); lua_pushvalue(L, 1); lua_call(L, 1, 1); return 1; }
int ScriptApiSecurity::sl_io_input(lua_State *L) { if (lua_isstring(L, 1)) { const char *path = lua_tostring(L, 1); CHECK_SECURE_PATH_INTERNAL(L, path, false, NULL); } push_original(L, "io", "input"); lua_pushvalue(L, 1); lua_call(L, 1, 1); return 1; }
int ScriptApiSecurity::sl_io_lines(lua_State *L) { if (lua_isstring(L, 1)) { const char *path = lua_tostring(L, 1); CHECK_SECURE_PATH(L, path); } push_original(L, "io", "lines"); lua_pushvalue(L, 1); int top_precall = lua_gettop(L); lua_call(L, 1, LUA_MULTRET); // Return number of arguments returned by the function, // adjusting for the function being poped. return lua_gettop(L) - (top_precall - 1); }
int ScriptApiSecurity::sl_os_rename(lua_State *L) { luaL_checktype(L, 1, LUA_TSTRING); const char *path1 = lua_tostring(L, 1); CHECK_SECURE_PATH_INTERNAL(L, path1, true, NULL); luaL_checktype(L, 2, LUA_TSTRING); const char *path2 = lua_tostring(L, 2); CHECK_SECURE_PATH_INTERNAL(L, path2, true, NULL); push_original(L, "os", "rename"); lua_pushvalue(L, 1); lua_pushvalue(L, 2); lua_call(L, 2, 2); return 2; }