1
0
Fork 0
mirror of https://github.com/luanti-org/luanti.git synced 2025-07-12 16:58:39 +00:00

Fix segfault in deprecation logging due to tail call, log by default (#10174)

This commit is contained in:
rubenwardy 2020-10-31 18:19:23 +00:00 committed by GitHub
parent 2dff3dd03f
commit 89dd05fdf3
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
9 changed files with 71 additions and 80 deletions

View file

@ -155,24 +155,28 @@ static void script_log(lua_State *L, const std::string &message,
infostream << script_get_backtrace(L) << std::endl;
}
void log_deprecated(lua_State *L, const std::string &message, int stack_depth)
DeprecatedHandlingMode get_deprecated_handling_mode()
{
static thread_local bool configured = false;
static thread_local bool do_log = false;
static thread_local bool do_error = false;
static thread_local DeprecatedHandlingMode ret = DeprecatedHandlingMode::Ignore;
// Only read settings on first call
if (!configured) {
std::string value = g_settings->get("deprecated_lua_api_handling");
if (value == "log") {
do_log = true;
ret = DeprecatedHandlingMode::Log;
} else if (value == "error") {
do_log = true;
do_error = true;
ret = DeprecatedHandlingMode::Error;
}
configured = true;
}
if (do_log)
script_log(L, message, warningstream, do_error, stack_depth);
return ret;
}
void log_deprecated(lua_State *L, const std::string &message, int stack_depth)
{
DeprecatedHandlingMode mode = get_deprecated_handling_mode();
if (mode != DeprecatedHandlingMode::Ignore)
script_log(L, message, warningstream, mode == DeprecatedHandlingMode::Error, stack_depth);
}

View file

@ -114,5 +114,25 @@ void script_error(lua_State *L, int pcall_result, const char *mod, const char *f
void script_run_callbacks_f(lua_State *L, int nargs,
RunCallbacksMode mode, const char *fxn);
enum class DeprecatedHandlingMode {
Ignore,
Log,
Error
};
/**
* Reads `deprecated_lua_api_handling` in settings, returns cached value.
*
* @return DeprecatedHandlingMode
*/
DeprecatedHandlingMode get_deprecated_handling_mode();
/**
* Handles a deprecation warning based on user settings
*
* @param L Lua State
* @param message The deprecation method
* @param stack_depth How far on the stack to the first user function (ie: not builtin or core)
*/
void log_deprecated(lua_State *L, const std::string &message,
int stack_depth=1);