Skip to content

Commit

Permalink
Add sanity checks for pool function calls
Browse files Browse the repository at this point in the history
  • Loading branch information
codenulls committed Dec 15, 2018
1 parent 22b7cf3 commit efa3c54
Show file tree
Hide file tree
Showing 5 changed files with 63 additions and 22 deletions.
2 changes: 0 additions & 2 deletions Client/game_sa/CPoolsSA.cpp
Expand Up @@ -183,8 +183,6 @@ SClientEntity<CVehicleSA>* CPoolsSA::GetVehicle(DWORD* pGameInterface)
{
DEBUG_TRACE("SClientEntity<CVehicleSA>* CPoolsSA::GetVehicle ( DWORD* pGameInterface )");

assert(pGameInterface);

if (m_bGetVehicleEnabled)
{
CVehicleSAInterface* pInterface = reinterpret_cast<CVehicleSAInterface*>(pGameInterface);
Expand Down
60 changes: 50 additions & 10 deletions Client/mods/deathmatch/logic/CClientGame.cpp
Expand Up @@ -4561,10 +4561,14 @@ bool CClientGame::VehicleCollisionHandler(CVehicleSAInterface*& pCollidingVehicl
{
CPools* pPools = g_pGame->GetPools();
SClientEntity<CVehicleSA>* pColliderEntity = pPools->GetVehicle((DWORD*)pCollidingVehicle);
;
if (pColliderEntity)
{
CClientEntity* pVehicleClientEntity = pColliderEntity->pClientEntity;
CClientEntity* pVehicleClientEntity = pColliderEntity->pClientEntity;
if (!pVehicleClientEntity)
{
return false;
}

CClientVehicle* pClientVehicle = static_cast<CClientVehicle*>(pVehicleClientEntity);
CClientEntity* pCollidedWithClientEntity = pPools->GetClientEntity((DWORD*)pCollidedWith);

Expand Down Expand Up @@ -4644,8 +4648,12 @@ bool CClientGame::HeliKillHandler(CVehicleSAInterface* pHeliInterface, CEntitySA
SClientEntity<CVehicleSA>* pVehicleEntity = pPools->GetVehicle((DWORD*)pHeliInterface);
if (pVehicleEntity)
{
CVehicle* pHeli = reinterpret_cast<CVehicle*>(pVehicleEntity->pEntity);
CClientVehicle* pClientHeli = reinterpret_cast<CClientVehicle*>(pVehicleEntity->pClientEntity);
if (!pClientHeli)
{
return true;
}

if (!pClientHeli->AreHeliBladeCollisionsEnabled())
{
return false;
Expand All @@ -4654,8 +4662,11 @@ bool CClientGame::HeliKillHandler(CVehicleSAInterface* pHeliInterface, CEntitySA
SClientEntity<CPedSA>* pPedEntity = pPools->GetPed((DWORD*)pHitInterface);
if (pPedEntity)
{
CPed* pPed = reinterpret_cast<CPed*>(pPedEntity->pEntity);
CClientPed* pClientPed = reinterpret_cast<CClientPed*>(pPedEntity->pClientEntity);
if (!pClientPed)
{
return false;
}

// Iterate our "stored" cancel state and find the heli in question
std::pair<std::multimap<CClientVehicle*, CClientPed*>::iterator, std::multimap<CClientVehicle*, CClientPed*>::iterator> iterators =
Expand Down Expand Up @@ -4714,7 +4725,12 @@ bool CClientGame::VehicleDamageHandler(CEntitySAInterface* pVehicleInterface, fl
if (pVehicleEntity)
{
CClientVehicle* pClientVehicle = reinterpret_cast<CClientVehicle*>(pVehicleEntity->pClientEntity);
CClientEntity* pClientAttacker = pPools->GetClientEntity((DWORD*)pAttackerInterface);
if (!pClientVehicle)
{
return bAllowDamage;
}

CClientEntity* pClientAttacker = pPools->GetClientEntity((DWORD*)pAttackerInterface);

// Compose arguments
// attacker, weapon, loss, damagepos, tyreIdx
Expand Down Expand Up @@ -4754,6 +4770,10 @@ bool CClientGame::ObjectDamageHandler(CObjectSAInterface* pObjectInterface, floa
if (pObjectEntity)
{
CClientObject* pClientObject = reinterpret_cast<CClientObject*>(pObjectEntity->pClientEntity);
if (!pClientObject)
{
return true;
}
CLuaArguments Arguments;
Arguments.PushNumber(fLoss);

Expand All @@ -4778,6 +4798,11 @@ bool CClientGame::ObjectBreakHandler(CObjectSAInterface* pObjectInterface, CEnti
if (pObjectEntity)
{
CClientObject* pClientObject = reinterpret_cast<CClientObject*>(pObjectEntity->pClientEntity);
if (!pClientObject)
{
return true;
}

if (!pClientObject->IsBreakable(false))
return false;

Expand Down Expand Up @@ -4808,13 +4833,21 @@ bool CClientGame::WaterCannonHitHandler(CVehicleSAInterface* pCannonVehicle, CPe
{
CLuaArguments Arguments;

CClientVehicle* pCannonClientVehicle = reinterpret_cast<CClientVehicle*>(pVehicleEntity->pClientEntity);
CClientVehicle* pCannonClientVehicle = reinterpret_cast<CClientVehicle*>(pVehicleEntity->pClientEntity);
if (!pCannonClientVehicle)
{
return false;
}

CClientPed* pClientPed = nullptr;
SClientEntity<CPedSA>* pPedEntity = pPools->GetPed((DWORD*)pHitPed);
if (pPedEntity)
{
pClientPed = reinterpret_cast<CClientPed*>(pPedEntity->pClientEntity);
Arguments.PushElement(pClientPed);
if (pClientPed)
{
Arguments.PushElement(pClientPed);
}
}
else
{
Expand All @@ -4823,7 +4856,7 @@ bool CClientGame::WaterCannonHitHandler(CVehicleSAInterface* pCannonVehicle, CPe

// Trigger our event
bool bContinue = true;
if (!IS_PLAYER(pClientPed))
if (pClientPed && !IS_PLAYER(pClientPed))
bContinue = pCannonClientVehicle->CallEvent("onClientPedHitByWaterCannon", Arguments, true);
else
bContinue = pCannonClientVehicle->CallEvent("onClientPlayerHitByWaterCannon", Arguments, true);
Expand All @@ -4844,8 +4877,11 @@ bool CClientGame::VehicleFellThroughMapHandler(CVehicleSAInterface* pVehicleInte
if (pVehicleEntity)
{
CClientVehicle* pClientVehicle = reinterpret_cast<CClientVehicle*>(pVehicleEntity->pClientEntity);
// handle or don't
return pClientVehicle->OnVehicleFallThroughMap();
if (pClientVehicle)
{
// handle or don't
return pClientVehicle->OnVehicleFallThroughMap();
}
}
}
// unhandled
Expand Down Expand Up @@ -5309,6 +5345,10 @@ void CClientGame::BulletImpact(CPed* pInitiator, CEntity* pVictim, const CVector
{
// Find the client ped that initiated the bullet impact
CClientPed* pInitiatorPed = reinterpret_cast<CClientPed*>(pPedEntity->pClientEntity);
if (!pInitiatorPed)
{
return;
}

// Calculate the collision of the bullet
CVector vecCollision;
Expand Down
8 changes: 4 additions & 4 deletions Client/mods/deathmatch/logic/CClientVehicle.cpp
Expand Up @@ -1930,7 +1930,7 @@ CClientVehicle* CClientVehicle::GetPreviousTrainCarriage(void)
CPools* pPools = g_pGame->GetPools();
CEntitySAInterface* pInterface = pPreviousTrainCarriage->GetInterface();
SClientEntity<CVehicleSA>* pVehicleClientEntity = pPools->GetVehicle((DWORD*)pInterface);
if (pVehicleClientEntity)
if (pVehicleClientEntity && pVehicleClientEntity->pClientEntity)
{
return reinterpret_cast<CClientVehicle*>(pVehicleClientEntity->pClientEntity);
}
Expand All @@ -1952,7 +1952,7 @@ CClientVehicle* CClientVehicle::GetNextTrainCarriage(void)
CPools* pPools = g_pGame->GetPools();
CEntitySAInterface* pInterface = pNextTrainCarriage->GetInterface();
SClientEntity<CVehicleSA>* pVehicleClientEntity = pPools->GetVehicle((DWORD*)pInterface);
if (pVehicleClientEntity)
if (pVehicleClientEntity && pVehicleClientEntity->pClientEntity)
{
return reinterpret_cast<CClientVehicle*>(pVehicleClientEntity->pClientEntity);
}
Expand Down Expand Up @@ -3052,7 +3052,7 @@ CClientVehicle* CClientVehicle::GetTowedVehicle(void)
{
CPools* pPools = g_pGame->GetPools();
SClientEntity<CVehicleSA>* pVehicleEntity = pPools->GetVehicle((DWORD*)pGameVehicle->GetInterface());
if (pVehicleEntity)
if (pVehicleEntity && pVehicleEntity->pClientEntity)
{
return reinterpret_cast<CClientVehicle*>(pVehicleEntity->pClientEntity);
}
Expand All @@ -3071,7 +3071,7 @@ CClientVehicle* CClientVehicle::GetRealTowedVehicle(void)
{
CPools* pPools = g_pGame->GetPools();
SClientEntity<CVehicleSA>* pVehicleEntity = pPools->GetVehicle((DWORD*)pGameVehicle->GetInterface());
if (pVehicleEntity)
if (pVehicleEntity && pVehicleEntity->pClientEntity)
{
return reinterpret_cast<CClientVehicle*>(pVehicleEntity->pClientEntity);
}
Expand Down
11 changes: 7 additions & 4 deletions Client/multiplayer_sa/CMultiplayerSA_1.3.cpp
Expand Up @@ -825,11 +825,14 @@ bool SirenCheckCameraPosition()
{
SClientEntity<CVehicleSA>* pVehicleClientEntity = pGameInterface->GetPools()->GetVehicle((DWORD*)pVehicleWithTheSiren);
CVehicle* pVehicle = pVehicleClientEntity ? pVehicleClientEntity->pEntity : nullptr;
// Do we have sirens given by us and is the 360 flag set?
if (pVehicle->DoesVehicleHaveSirens() && pVehicle->IsSiren360EffectEnabled())
if (pVehicle)
{
// Do 360 code
return true;
// Do we have sirens given by us and is the 360 flag set?
if (pVehicle->DoesVehicleHaveSirens() && pVehicle->IsSiren360EffectEnabled())
{
// Do 360 code
return true;
}
}
}
// Only visible from the front
Expand Down
4 changes: 2 additions & 2 deletions Client/multiplayer_sa/multiplayer_shotsync.cpp
Expand Up @@ -1160,7 +1160,7 @@ void OnMy_CWeapon_FireInstantHit_Mid(CEntitySAInterface* pEntity, CVector* pvecN
{
SClientEntity<CPedSA>* pPedClientEntity = m_pools->GetPed((DWORD*)pEntity);
CPed* pTargetingPed = pPedClientEntity ? pPedClientEntity->pEntity : nullptr;
if (IsLocalPlayer(pTargetingPed))
if (pTargetingPed && IsLocalPlayer(pTargetingPed))
{
CVector vecEnd = *pvecEnd;
CVector vecStart = *pvecAimedStart;
Expand Down Expand Up @@ -1246,7 +1246,7 @@ void OnMy_CWeapon_FireSniper_Mid(CEntitySAInterface* pEntity, CVector* pvecEndHi
{
SClientEntity<CPedSA>* pPedClientEntity = m_pools->GetPed((DWORD*)pEntity);
CPed* pTargetingPed = pPedClientEntity ? pPedClientEntity->pEntity : nullptr;
if (IsLocalPlayer(pTargetingPed))
if (pTargetingPed && IsLocalPlayer(pTargetingPed))
{
CVector vecEnd = *pvecEndMaxRange;
CVector vecStart = *pvecStart;
Expand Down

0 comments on commit efa3c54

Please sign in to comment.