From fff69c74f470b6cb8c7ce9f5f1fd7dc83386daca Mon Sep 17 00:00:00 2001 From: bsongis Date: Sat, 13 Sep 2014 13:11:05 +0200 Subject: [PATCH] Tests added to avoid doing anything in the Lua interpreter after a Lua Panic --- radio/src/lua.cpp | 53 +++++++++++++++++++++++++++++----------------- radio/src/opentx.h | 4 +--- 2 files changed, 34 insertions(+), 23 deletions(-) diff --git a/radio/src/lua.cpp b/radio/src/lua.cpp index 877a44273..224f1b88f 100644 --- a/radio/src/lua.cpp +++ b/radio/src/lua.cpp @@ -1525,6 +1525,10 @@ int luaLoad(const char *filename, ScriptInternalData & sid, ScriptInputsOutputs luaFree(sid); + if (luaState == INTERPRETER_PANIC) { + return SCRIPT_PANIC; + } + SET_LUA_INSTRUCTIONS_COUNT(MANUAL_SCRIPTS_MAX_INSTRUCTIONS); PROTECT_LUA() { @@ -1572,8 +1576,8 @@ int luaLoad(const char *filename, ScriptInternalData & sid, ScriptInputsOutputs } } else { - TRACE("Panic in script %s: %s", filename, lua_tostring(L, -1)); - sid.state = SCRIPT_PANIC; + luaDisable(); + return SCRIPT_PANIC; } UNPROTECT_LUA(); @@ -1584,7 +1588,7 @@ int luaLoad(const char *filename, ScriptInternalData & sid, ScriptInputsOutputs return sid.state; } -void luaLoadMixScript(uint8_t index) +bool luaLoadMixScript(uint8_t index) { ScriptData & sd = g_model.scriptsData[index]; @@ -1597,8 +1601,11 @@ void luaLoadMixScript(uint8_t index) strncpy(filename+sizeof(SCRIPTS_MIXES_PATH), sd.file, sizeof(sd.file)); filename[sizeof(SCRIPTS_MIXES_PATH)+sizeof(sd.file)] = '\0'; strcat(filename+sizeof(SCRIPTS_MIXES_PATH), SCRIPTS_EXT); - luaLoad(filename, sid, sio); + if (luaLoad(filename, sid, sio) == SCRIPT_PANIC) { + return false; + } } + return true; } bool luaLoadFunctionScript(uint8_t index) @@ -1614,13 +1621,15 @@ bool luaLoadFunctionScript(uint8_t index) strncpy(filename+sizeof(SCRIPTS_FUNCS_PATH), fn.play.name, sizeof(fn.play.name)); filename[sizeof(SCRIPTS_FUNCS_PATH)+sizeof(fn.play.name)] = '\0'; strcat(filename+sizeof(SCRIPTS_FUNCS_PATH), SCRIPTS_EXT); - luaLoad(filename, sid); + if (luaLoad(filename, sid) == SCRIPT_PANIC) { + return false; + } } else { + POPUP_WARNING(STR_TOO_MANY_LUA_SCRIPTS); return false; } } - return true; } @@ -1649,9 +1658,12 @@ bool luaLoadTelemetryScript(uint8_t index) ScriptInternalData & sid = scriptInternalData[luaScriptsCount++]; sid.reference = SCRIPT_TELEMETRY_FIRST+index; sid.state = SCRIPT_NOFILE; - luaLoad(path, sid); + if (luaLoad(path, sid) == SCRIPT_PANIC) { + return false; + } } else { + POPUP_WARNING(STR_TOO_MANY_LUA_SCRIPTS); return false; } } @@ -1677,13 +1689,14 @@ void luaLoadPermanentScripts() // Load model scripts for (int i=0; i