Skip to content

Commit a1d0cd7

Browse files
Code cleanup
Fixed if someone naughty sets package as nil.
1 parent a593163 commit a1d0cd7

File tree

2 files changed

+27
-32
lines changed

2 files changed

+27
-32
lines changed

Server/mods/deathmatch/logic/lua/CLuaMain.cpp

Lines changed: 26 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ CLuaMain::CLuaMain ( CLuaManager* pLuaManager,
6363

6464
m_bEnableOOP = bEnableOOP;
6565

66+
m_iPackageLoadedRef = -1;
6667

6768
CPerfStatLuaMemory::GetSingleton ()->OnLuaMainCreate ( this );
6869
CPerfStatLuaTiming::GetSingleton ()->OnLuaMainCreate ( this );
@@ -712,7 +713,11 @@ void CLuaMain::InitPackageStorage(lua_State* L)
712713
lua_settable(L, -3); // stack: [tbl_new,"loaded",tbl_new2]
713714
}
714715

715-
// Finally, store our original table as package.loaded
716+
// Keep our package.loaded table safely in registry
717+
m_iPackageLoadedRef = luaL_ref(L, LUA_REGISTRYINDEX); // stack: [tbl_new,"loaded"]
718+
lua_rawgeti(L, LUA_REGISTRYINDEX, m_iPackageLoadedRef); // stack: [tbl_new,"loaded",tbl_new2]
719+
720+
// Finally, store our original table as global package.loaded
716721
lua_settable(L, -3); // stack: [tbl_new]
717722
lua_setglobal(L, "package"); // stack: []
718723
}
@@ -721,33 +726,28 @@ void CLuaMain::InitPackageStorage(lua_State* L)
721726
//
722727
// CLuaMain::SetPackage
723728
//
724-
// Pop the top most value as a package
729+
// Set the top most value as a package (No pop)
725730
//
726731
///////////////////////////////////////////////////////////////
727732
void CLuaMain::SetPackage(lua_State* L, SString &strName )
728733
{
734+
if (m_iPackageLoadedRef < 0)
735+
return;
729736
// We set varPkg, which is already on the stack, into package.loaded.moduleName = varPkg.
730-
// stack: [varPkg]
731-
int iPkg = luaL_ref(L, LUA_REGISTRYINDEX); // stack: []
732-
lua_getglobal(L, "package"); // stack: [tbl_package]
733-
if (lua_type(L, -1) == LUA_TNIL )
734-
InitPackageStorage(L);
735-
736-
lua_pushstring(L, "loaded"); // stack: [tbl_package,"loaded"]
737-
lua_rawget(L, -2); // stack: [tbl_package,tbl_loaded]
738-
if (lua_type(L, -1) == LUA_TNIL)
739-
InitPackageStorage(L);
737+
// stack: [varPkg]
738+
int iPkg = luaL_ref(L, LUA_REGISTRYINDEX); // stack: []
739+
lua_rawgeti(L, LUA_REGISTRYINDEX, m_iPackageLoadedRef); // [tbl_loaded]
740740

741741

742-
lua_pushstring(L, strName.c_str()); // stack: [tbl_package,tbl_loaded,"moduleName"]
743-
lua_rawgeti(L, LUA_REGISTRYINDEX, iPkg); // stack: [tbl_package,tbl_loaded,"moduleName",varPkg]
744-
lua_rawset(L, -3); // stack: [tbl_package,tbl_loaded]
745-
lua_pop(L, 2); // stack: []
746-
lua_rawgeti(L, LUA_REGISTRYINDEX, iPkg); // stack: [varPkg]
742+
lua_pushstring(L, strName.c_str()); // stack: [tbl_loaded,"moduleName"]
743+
lua_rawgeti(L, LUA_REGISTRYINDEX, iPkg); // stack: [tbl_loaded,"moduleName",varPkg]
744+
lua_rawset(L, -3); // stack: [tbl_loaded]
745+
lua_pop(L, 2); // stack: []
746+
lua_rawgeti(L, LUA_REGISTRYINDEX, iPkg); // stack: [varPkg]
747747

748-
// Cleanup our used registry entry, REGISTRY[i] = nil.
749-
lua_pushnil(L); // stack: [varPkg,nil]
750-
lua_rawseti(L, LUA_REGISTRYINDEX, iPkg); // stack: [varPkg]
748+
// Cleanup our used registry entry, i.e. REGISTRY[i] = nil.
749+
lua_pushnil(L); // stack: [varPkg,nil]
750+
lua_rawseti(L, LUA_REGISTRYINDEX, iPkg); // stack: [varPkg]
751751
}
752752

753753
///////////////////////////////////////////////////////////////
@@ -759,18 +759,13 @@ void CLuaMain::SetPackage(lua_State* L, SString &strName )
759759
///////////////////////////////////////////////////////////////
760760
void CLuaMain::GetPackage(lua_State* L, SString &strName)
761761
{
762-
lua_getglobal(L, "package"); // stack: [tbl_package]
763-
if (lua_type(L, -1) == LUA_TNIL )
764-
InitPackageStorage(m_luaVM);
765-
766-
lua_pushstring(L, "loaded"); // stack: [tbl_package,"loaded"]
767-
if (lua_type(L, -1) == LUA_TNIL)
768-
InitPackageStorage(m_luaVM);
762+
if (m_iPackageLoadedRef < 0)
763+
return;
769764

770-
lua_rawget(L, -2); // stack: [tbl_package,tbl_loaded]
771-
lua_pushstring(L, strName.c_str()); // stack: [tbl_package,tbl_loaded,"moduleName"]
772-
lua_rawget(L, -2); // stack: [tbl_package,varPkg]
773-
lua_remove(L, -2); // stack: [varPkg]
765+
lua_rawgeti(L, LUA_REGISTRYINDEX, m_iPackageLoadedRef); // stack: [tbl_loaded]
766+
lua_pushstring(L, strName.c_str()); // stack: [tbl_loaded,"moduleName"]
767+
lua_rawget(L, -2); // stack: [tbl_loaded,varPkg]
768+
lua_remove(L, -2); // stack: [varPkg]
774769
}
775770

776771
///////////////////////////////////////////////////////////////
@@ -812,7 +807,6 @@ bool CLuaMain::LoadLuaLib(lua_State *L, SString strName)
812807
lua_settop(L, luaSavedTop+1);
813808

814809
SetPackage(L, strName); // Store our package into package.loaded
815-
GetPackage(L, strName); // Grab it back as a return value.
816810
return true;
817811
}
818812

Server/mods/deathmatch/logic/lua/CLuaMain.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,7 @@ class CLuaMain //: public CClient
141141

142142
lua_State* m_luaVM;
143143
CLuaTimerManager* m_pLuaTimerManager;
144+
int m_iPackageLoadedRef;
144145

145146
class CResource* m_pResource;
146147
class CResourceFile* m_pResourceFile;

0 commit comments

Comments
 (0)