From 945a0a1de46a879cc814312731959016ddc65fc6 Mon Sep 17 00:00:00 2001 From: Patrik Juvonen Date: Sat, 4 Aug 2018 19:48:48 +0300 Subject: [PATCH 1/3] CLuaEngineDefs: fix invalid model ID engine LOD function crash --- .../logic/luadefs/CLuaEngineDefs.cpp | 28 ++++++++++++------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp b/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp index 154fcbe62d3..21a645e6579 100644 --- a/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp +++ b/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp @@ -559,12 +559,16 @@ int CLuaEngineDefs::EngineGetModelLODDistance(lua_State* luaVM) if (!argStream.HasErrors()) { ushort usModelID = CModelNames::ResolveModelID(strModelId); - CModelInfo* pModelInfo = g_pGame->GetModelInfo(usModelID); - if (pModelInfo) + // Ensure we have a good model (#9139) + if (CClientObjectManager::IsValidModel(usModelID)) { - float fDistance = pModelInfo->GetLODDistance(); - lua_pushnumber(luaVM, fDistance); - return 1; + CModelInfo* pModelInfo = g_pGame->GetModelInfo(usModelID); + if (pModelInfo) + { + float fDistance = pModelInfo->GetLODDistance(); + lua_pushnumber(luaVM, fDistance); + return 1; + } } } else @@ -586,12 +590,16 @@ int CLuaEngineDefs::EngineSetModelLODDistance(lua_State* luaVM) if (!argStream.HasErrors()) { unsigned short usModelID = CModelNames::ResolveModelID(strModel); - CModelInfo* pModelInfo = g_pGame->GetModelInfo(usModelID); - if (pModelInfo && fDistance > 0.0f) + // Ensure we have a good model (#9139) + if (CClientObjectManager::IsValidModel(usModelID)) { - pModelInfo->SetLODDistance(fDistance); - lua_pushboolean(luaVM, true); - return 1; + CModelInfo* pModelInfo = g_pGame->GetModelInfo(usModelID); + if (pModelInfo && fDistance > 0.0f) + { + pModelInfo->SetLODDistance(fDistance); + lua_pushboolean(luaVM, true); + return 1; + } } } else From 8c910e5e5d3971a7171c8eefddc7b6911d9d1c05 Mon Sep 17 00:00:00 2001 From: Patrik Juvonen Date: Mon, 6 Aug 2018 17:42:29 +0300 Subject: [PATCH 2/3] Addendum to previous commit, check for ped/veh models as well --- Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp b/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp index 21a645e6579..d0fc7d56974 100644 --- a/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp +++ b/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp @@ -560,7 +560,7 @@ int CLuaEngineDefs::EngineGetModelLODDistance(lua_State* luaVM) { ushort usModelID = CModelNames::ResolveModelID(strModelId); // Ensure we have a good model (#9139) - if (CClientObjectManager::IsValidModel(usModelID)) + if (CClientObjectManager::IsValidModel(usModelID) || CClientVehicleManager::IsValidModel(usModelID) || CClientPlayerManager::IsValidModel(usModelID)) { CModelInfo* pModelInfo = g_pGame->GetModelInfo(usModelID); if (pModelInfo) @@ -591,7 +591,7 @@ int CLuaEngineDefs::EngineSetModelLODDistance(lua_State* luaVM) { unsigned short usModelID = CModelNames::ResolveModelID(strModel); // Ensure we have a good model (#9139) - if (CClientObjectManager::IsValidModel(usModelID)) + if (CClientObjectManager::IsValidModel(usModelID) || CClientVehicleManager::IsValidModel(usModelID) || CClientPlayerManager::IsValidModel(usModelID)) { CModelInfo* pModelInfo = g_pGame->GetModelInfo(usModelID); if (pModelInfo && fDistance > 0.0f) From f7d5b194b4b90eaa3b578300bfbed409eecea2eb Mon Sep 17 00:00:00 2001 From: Patrik Juvonen Date: Sun, 24 Feb 2019 14:35:11 +0200 Subject: [PATCH 3/3] Error out if model ID is over 20000 until we have a more permanent solution --- .../logic/luadefs/CLuaEngineDefs.cpp | 35 ++++++++++--------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp b/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp index a8ff488ffb4..2f9e44e1a03 100644 --- a/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp +++ b/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp @@ -562,27 +562,27 @@ int CLuaEngineDefs::EngineRestoreAnimation(lua_State* luaVM) int CLuaEngineDefs::EngineGetModelLODDistance(lua_State* luaVM) { // float engineGetModelLODDistance ( int/string modelID ) - SString strModelId; - + SString strModelId; CScriptArgReader argStream(luaVM); argStream.ReadString(strModelId); if (!argStream.HasErrors()) { - ushort usModelID = CModelNames::ResolveModelID(strModelId); - // Ensure we have a good model (#9139) - if (CClientObjectManager::IsValidModel(usModelID) || CClientVehicleManager::IsValidModel(usModelID) || CClientPlayerManager::IsValidModel(usModelID)) + ushort usModelID = CModelNames::ResolveModelID(strModelId); + // Ensure we have a good model (GitHub #446) + if (usModelID < 20000) { CModelInfo* pModelInfo = g_pGame->GetModelInfo(usModelID); if (pModelInfo) { - float fDistance = pModelInfo->GetLODDistance(); - lua_pushnumber(luaVM, fDistance); + lua_pushnumber(luaVM, pModelInfo->GetLODDistance()); return 1; } } + else + argStream.SetCustomError(SString("Expected a valid model name or ID in range [0-19999] at argument 1, got \"%s\"", *strModelId)); } - else + if (argStream.HasErrors()) m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); // Failed @@ -592,19 +592,20 @@ int CLuaEngineDefs::EngineGetModelLODDistance(lua_State* luaVM) int CLuaEngineDefs::EngineSetModelLODDistance(lua_State* luaVM) { - SString strModel = ""; - float fDistance = 0.0; + // bool engineSetModelLODDistance ( int/string modelID, float distance ) + SString strModelId; + float fDistance; CScriptArgReader argStream(luaVM); - argStream.ReadString(strModel); + argStream.ReadString(strModelId); argStream.ReadNumber(fDistance); if (!argStream.HasErrors()) { - unsigned short usModelID = CModelNames::ResolveModelID(strModel); - // Ensure we have a good model (#9139) - if (CClientObjectManager::IsValidModel(usModelID) || CClientVehicleManager::IsValidModel(usModelID) || CClientPlayerManager::IsValidModel(usModelID)) + ushort usModelID = CModelNames::ResolveModelID(strModelId); + // Ensure we have a good model (GitHub #446) + if (usModelID < 20000) { - CModelInfo* pModelInfo = g_pGame->GetModelInfo(usModelID); + CModelInfo* pModelInfo = g_pGame->GetModelInfo(usModelID); if (pModelInfo && fDistance > 0.0f) { pModelInfo->SetLODDistance(fDistance); @@ -612,8 +613,10 @@ int CLuaEngineDefs::EngineSetModelLODDistance(lua_State* luaVM) return 1; } } + else + argStream.SetCustomError(SString("Expected a valid model name or ID in range [0-19999] at argument 1, got \"%s\"", *strModelId)); } - else + if (argStream.HasErrors()) m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage()); lua_pushboolean(luaVM, false);