From 63f1eea7ca8ee427eb6761f23e29420ce0188042 Mon Sep 17 00:00:00 2001 From: Kyzentun Date: Tue, 1 Jul 2014 22:40:00 -0600 Subject: [PATCH] Changed SCREENMAN:SetNewScreen and AddNewScreenToTop to emit an error for an invalid screen instead of crashing stepmania. --- src/ScreenManager.cpp | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/src/ScreenManager.cpp b/src/ScreenManager.cpp index 9b68e660c0..7124867c4c 100644 --- a/src/ScreenManager.cpp +++ b/src/ScreenManager.cpp @@ -862,7 +862,29 @@ public: // Note: PrepareScreen binding is not allowed; loading data inside // Lua causes the Lua lock to be held for the duration of the load, // which blocks concurrent rendering - static int SetNewScreen( T* p, lua_State *L ) { p->SetNewScreen( SArg(1) ); return 0; } + static void ValidateScreenName(lua_State* L, RString& name) + { + if(name == "") + { + RString errstr= "Screen name is empty."; + SCREENMAN->SystemMessage(errstr); + luaL_error(L, errstr.c_str()); + } + RString ClassName= THEME->GetMetric(name, "Class"); + if(g_pmapRegistrees->find(ClassName) == g_pmapRegistrees->end()) + { + RString errstr= "Screen \"" + name + "\" has an invalid class \"" + ClassName + "\"."; + SCREENMAN->SystemMessage(errstr); + luaL_error(L, errstr.c_str()); + } + } + static int SetNewScreen( T* p, lua_State *L ) + { + RString screen= SArg(1); + ValidateScreenName(L, screen); + p->SetNewScreen(screen); + return 0; + } static int GetTopScreen( T* p, lua_State *L ) { Actor *pScreen = p->GetTopScreen(); @@ -877,6 +899,8 @@ public: static int ScreenClassExists( T* p, lua_State *L ) { lua_pushboolean( L, g_pmapRegistrees->find( SArg(1) ) != g_pmapRegistrees->end() ); return 1; } static int AddNewScreenToTop( T* p, lua_State *L ) { + RString screen= SArg(1); + ValidateScreenName(L, screen); ScreenMessage SM = SM_None; if( lua_gettop(L) >= 2 && !lua_isnil(L,2) ) { @@ -884,7 +908,7 @@ public: SM = ScreenMessageHelpers::ToScreenMessage( sMessage ); } - p->AddNewScreenToTop( SArg(1), SM ); + p->AddNewScreenToTop( screen, SM ); return 0; } //static int GetScreenStackSize( T* p, lua_State *L ) { lua_pushnumber( L, ScreenManagerUtil::g_ScreenStack.size() ); return 1; }