From c9e8a5741884bd76a44b10807f4612f6fab4183d Mon Sep 17 00:00:00 2001 From: Jacek Jendrzej Date: Thu, 19 May 2016 15:22:15 +0200 Subject: [PATCH] check if string msg is not NULL, fix segfault --- src/gui/lua/lua_menue.cpp | 30 ++++++++++++++++++++---------- src/gui/lua/lua_video.cpp | 4 +++- src/gui/lua/luainstance.cpp | 12 ++++++++---- src/gui/widget/messagebox.cpp | 8 ++++++-- 4 files changed, 37 insertions(+), 17 deletions(-) diff --git a/src/gui/lua/lua_menue.cpp b/src/gui/lua/lua_menue.cpp index 0f3998402..100056ba5 100644 --- a/src/gui/lua/lua_menue.cpp +++ b/src/gui/lua/lua_menue.cpp @@ -56,8 +56,10 @@ bool CLuaMenuChangeObserver::changeNotify(lua_State *L, const std::string &luaAc lua_pushstring(L, optionValue); int status = lua_pcall(L, 2 /* two args */, 1 /* one result */, 0); if (status) { - fprintf(stderr, "[CLuaMenuChangeObserver::%s:%d] error in script: %s\n", __func__, __LINE__, lua_tostring(L, -1)); - DisplayErrorMessage(lua_tostring(L, -1), "Lua Script Error:"); + bool isString = lua_isstring(L,-1); + const char *null = "NULL"; + fprintf(stderr, "[CLuaMenuChangeObserver::%s:%d] error in script: %s\n", __func__, __LINE__, isString ? lua_tostring(L, -1): null); + DisplayErrorMessage(isString ? lua_tostring(L, -1):null, "Lua Script Error:"); } double res = lua_isnumber(L, -1) ? lua_tonumber(L, -1) : 0; return (((int)res == menu_return::RETURN_REPAINT) || ((int)res == menu_return::RETURN_EXIT_REPAINT)); @@ -135,8 +137,10 @@ int CLuaMenuForwarder::exec(CMenuTarget* /*parent*/, const std::string & /*actio lua_pushstring(L, luaId.c_str()); int status = lua_pcall(L, 1 /* one arg */, 1 /* one result */, 0); if (status) { - fprintf(stderr, "[CLuaMenuForwarder::%s:%d] error in script: %s\n", __func__, __LINE__, lua_tostring(L, -1)); - DisplayErrorMessage(lua_tostring(L, -1), "Lua Script Error:"); + bool isString = lua_isstring(L,-1); + const char *null = "NULL"; + fprintf(stderr, "[CLuaMenuForwarder::%s:%d] error in script: %s\n", __func__, __LINE__, isString ? lua_tostring(L, -1):null); + DisplayErrorMessage(isString ? lua_tostring(L, -1):null, "Lua Script Error:"); } if (lua_isnumber(L, -1)) res = (int) lua_tonumber(L, -1); @@ -179,8 +183,10 @@ int CLuaMenuFilebrowser::exec(CMenuTarget* /*parent*/, const std::string& /*acti lua_pushstring(L, value->c_str()); int status = lua_pcall(L, 2 /* two arg */, 1 /* one result */, 0); if (status) { - fprintf(stderr, "[CLuaMenuFilebrowser::%s:%d] error in script: %s\n", __func__, __LINE__, lua_tostring(L, -1)); - DisplayErrorMessage(lua_tostring(L, -1), "Lua Script Error:"); + bool isString = lua_isstring(L,-1); + const char *null = "NULL"; + fprintf(stderr, "[CLuaMenuFilebrowser::%s:%d] error in script: %s\n", __func__, __LINE__, isString ? lua_tostring(L, -1):null); + DisplayErrorMessage(isString ? lua_tostring(L, -1):null, "Lua Script Error:"); } lua_pop(L, 1); } @@ -222,8 +228,10 @@ int CLuaMenuStringinput::exec(CMenuTarget* /*parent*/, const std::string & /*act lua_pushstring(L, value->c_str()); int status = lua_pcall(L, 2 /* two arg */, 1 /* one result */, 0); if (status) { - fprintf(stderr, "[CLuaMenuStringinput::%s:%d] error in script: %s\n", __func__, __LINE__, lua_tostring(L, -1)); - DisplayErrorMessage(lua_tostring(L, -1), "Lua Script Error:"); + bool isString = lua_isstring(L,-1); + const char *null = "NULL"; + fprintf(stderr, "[CLuaMenuStringinput::%s:%d] error in script: %s\n", __func__, __LINE__, isString ? lua_tostring(L, -1):null); + DisplayErrorMessage(isString ? lua_tostring(L, -1):null, "Lua Script Error:"); } lua_pop(L, 2); } @@ -260,8 +268,10 @@ int CLuaMenuKeyboardinput::exec(CMenuTarget* /*parent*/, const std::string & /*a lua_pushstring(L, value->c_str()); int status = lua_pcall(L, 2 /* two arg */, 1 /* one result */, 0); if (status) { - fprintf(stderr, "[CLuaMenuKeyboardinput::%s:%d] error in script: %s\n", __func__, __LINE__, lua_tostring(L, -1)); - DisplayErrorMessage(lua_tostring(L, -1), "Lua Script Error:"); + bool isString = lua_isstring(L,-1); + const char *null = "NULL"; + fprintf(stderr, "[CLuaMenuKeyboardinput::%s:%d] error in script: %s\n", __func__, __LINE__, isString ? lua_tostring(L, -1):null); + DisplayErrorMessage(isString ? lua_tostring(L, -1):null, "Lua Script Error:"); } lua_pop(L, 2); } diff --git a/src/gui/lua/lua_video.cpp b/src/gui/lua/lua_video.cpp index 74f1586cc..c7df7912d 100644 --- a/src/gui/lua/lua_video.cpp +++ b/src/gui/lua/lua_video.cpp @@ -221,7 +221,9 @@ bool CLuaInstVideo::execLuaInfoFunc(lua_State *L, int xres, int yres, int aspect lua_getstack(L, 1, &ar); lua_getinfo(L, "Sl", &ar); memset(msg, '\0', sizeof(msg)); - snprintf(msg, sizeof(msg)-1, "[%s:%d] error running function '%s': %s", ar.short_src, ar.currentline, D->infoFunc.c_str(), lua_tostring(L, -1)); + bool isString = lua_isstring(L,-1); + const char *null = "NULL"; + snprintf(msg, sizeof(msg)-1, "[%s:%d] error running function '%s': %s", ar.short_src, ar.currentline, D->infoFunc.c_str(), isString ? lua_tostring(L, -1):null); fprintf(stderr, "[CLuaInstVideo::%s:%d] %s\n", __func__, __LINE__, msg); DisplayErrorMessage(msg); return false; diff --git a/src/gui/lua/luainstance.cpp b/src/gui/lua/luainstance.cpp index 6c7516e4a..62aca87c7 100644 --- a/src/gui/lua/luainstance.cpp +++ b/src/gui/lua/luainstance.cpp @@ -435,8 +435,10 @@ void CLuaInstance::runScript(const char *fileName, std::vector *arg /* run the script */ int status = luaL_loadfile(lua, fileName); if (status) { - fprintf(stderr, "[CLuaInstance::%s] Can't load file: %s\n", __func__, lua_tostring(lua, -1)); - DisplayErrorMessage(lua_tostring(lua, -1), "Lua Script Error:"); + bool isString = lua_isstring(lua,-1); + const char *null = "NULL"; + fprintf(stderr, "[CLuaInstance::%s] Can't load file: %s\n", __func__, isString ? lua_tostring(lua, -1):null); + DisplayErrorMessage(isString ? lua_tostring(lua, -1):null, "Lua Script Error:"); if (error_string) *error_string = std::string(lua_tostring(lua, -1)); return; @@ -466,8 +468,10 @@ void CLuaInstance::runScript(const char *fileName, std::vector *arg *result_string = std::string(lua_tostring(lua, -1)); if (status) { - fprintf(stderr, "[CLuaInstance::%s] error in script: %s\n", __func__, lua_tostring(lua, -1)); - DisplayErrorMessage(lua_tostring(lua, -1), "Lua Script Error:"); + bool isString = lua_isstring(lua,-1); + const char *null = "NULL"; + fprintf(stderr, "[CLuaInstance::%s] error in script: %s\n", __func__, isString ? lua_tostring(lua, -1):null); + DisplayErrorMessage(isString ? lua_tostring(lua, -1):null, "Lua Script Error:"); if (error_string) *error_string = std::string(lua_tostring(lua, -1)); /* restoreNeutrino at plugin crash, when blocked from plugin */ diff --git a/src/gui/widget/messagebox.cpp b/src/gui/widget/messagebox.cpp index 21319d493..b506f3cee 100644 --- a/src/gui/widget/messagebox.cpp +++ b/src/gui/widget/messagebox.cpp @@ -289,7 +289,9 @@ int CMessageBox::exec(int timeout) int ShowMsg(const neutrino_locale_t Caption, const char * const Text, const CMessageBox::result_ &Default, const uint32_t ShowButtons, const char * const Icon, const int Width, const int timeout, bool returnDefaultOnTimeout) { - std::string tmpText = Text; + std::string tmpText = "msg error"; + if(!Text) + tmpText = Text; CMessageBox* messageBox = new CMessageBox(Caption, tmpText.c_str(), Width, Icon, Default, ShowButtons); messageBox->returnDefaultValueOnTimeout(returnDefaultOnTimeout); messageBox->exec(timeout); @@ -301,7 +303,9 @@ int ShowMsg(const neutrino_locale_t Caption, const char * const Text, const CMes int ShowMsg(const std::string &Caption, const char * const Text, const CMessageBox::result_ &Default, const uint32_t ShowButtons, const char * const Icon, const int Width, const int timeout, bool returnDefaultOnTimeout) { - std::string tmpText = Text; + std::string tmpText = "msg error"; + if(!Text) + tmpText = Text; CMessageBox* messageBox = new CMessageBox(Caption, tmpText.c_str(), Width, Icon, Default, ShowButtons); messageBox->returnDefaultValueOnTimeout(returnDefaultOnTimeout); messageBox->exec(timeout);