Push error handler afresh each time lua_pcall is used
Fixes "double fault" / "error in error handling" messages (issue #1423) and instead shows a complete backtrace.
This commit is contained in:
@@ -27,13 +27,15 @@ bool ScriptApiServer::getAuth(const std::string &playername,
|
||||
{
|
||||
SCRIPTAPI_PRECHECKHEADER
|
||||
|
||||
int error_handler = PUSH_ERROR_HANDLER(L);
|
||||
getAuthHandler();
|
||||
lua_getfield(L, -1, "get_auth");
|
||||
if (lua_type(L, -1) != LUA_TFUNCTION)
|
||||
throw LuaError("Authentication handler missing get_auth");
|
||||
lua_pushstring(L, playername.c_str());
|
||||
PCALL_RES(lua_pcall(L, 1, 1, m_errorhandler));
|
||||
PCALL_RES(lua_pcall(L, 1, 1, error_handler));
|
||||
lua_remove(L, -2); // Remove auth handler
|
||||
lua_remove(L, error_handler);
|
||||
|
||||
// nil = login not allowed
|
||||
if (lua_isnil(L, -1))
|
||||
@@ -99,6 +101,7 @@ void ScriptApiServer::createAuth(const std::string &playername,
|
||||
{
|
||||
SCRIPTAPI_PRECHECKHEADER
|
||||
|
||||
int error_handler = PUSH_ERROR_HANDLER(L);
|
||||
getAuthHandler();
|
||||
lua_getfield(L, -1, "create_auth");
|
||||
lua_remove(L, -2); // Remove auth handler
|
||||
@@ -106,7 +109,8 @@ void ScriptApiServer::createAuth(const std::string &playername,
|
||||
throw LuaError("Authentication handler missing create_auth");
|
||||
lua_pushstring(L, playername.c_str());
|
||||
lua_pushstring(L, password.c_str());
|
||||
PCALL_RES(lua_pcall(L, 2, 0, m_errorhandler));
|
||||
PCALL_RES(lua_pcall(L, 2, 0, error_handler));
|
||||
lua_pop(L, 1); // Pop error handler
|
||||
}
|
||||
|
||||
bool ScriptApiServer::setPassword(const std::string &playername,
|
||||
@@ -114,6 +118,7 @@ bool ScriptApiServer::setPassword(const std::string &playername,
|
||||
{
|
||||
SCRIPTAPI_PRECHECKHEADER
|
||||
|
||||
int error_handler = PUSH_ERROR_HANDLER(L);
|
||||
getAuthHandler();
|
||||
lua_getfield(L, -1, "set_password");
|
||||
lua_remove(L, -2); // Remove auth handler
|
||||
@@ -121,7 +126,8 @@ bool ScriptApiServer::setPassword(const std::string &playername,
|
||||
throw LuaError("Authentication handler missing set_password");
|
||||
lua_pushstring(L, playername.c_str());
|
||||
lua_pushstring(L, password.c_str());
|
||||
PCALL_RES(lua_pcall(L, 2, 1, m_errorhandler));
|
||||
PCALL_RES(lua_pcall(L, 2, 1, error_handler));
|
||||
lua_remove(L, error_handler);
|
||||
return lua_toboolean(L, -1);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user