From 9ec7feb9ab841edad3e43a830436c13ce4b8159c Mon Sep 17 00:00:00 2001 From: Nicholas Hastings Date: Sun, 28 Nov 2010 22:41:48 -0500 Subject: [PATCH] Fixed CDetour crash in TF2 extension when last plugin using forward is unloaded (bug 4713, r=fyren). --- extensions/tf2/criticals.cpp | 30 +++++++++++++++++++++++------- extensions/tf2/criticals.h | 2 +- extensions/tf2/extension.cpp | 20 +++++++++----------- extensions/tf2/gameplayrules.cpp | 5 +++-- extensions/tf2/gameplayrules.h | 2 +- extensions/tf2/holiday.cpp | 11 ++++++----- extensions/tf2/holiday.h | 2 +- 7 files changed, 44 insertions(+), 28 deletions(-) diff --git a/extensions/tf2/criticals.cpp b/extensions/tf2/criticals.cpp index 4c523a3d..f072cc36 100644 --- a/extensions/tf2/criticals.cpp +++ b/extensions/tf2/criticals.cpp @@ -188,7 +188,7 @@ DETOUR_DECL_MEMBER0(CalcIsAttackCriticalHelperBow, bool) } } -void InitialiseCritDetours() +bool InitialiseCritDetours() { calcIsAttackCriticalDetour = DETOUR_CREATE_MEMBER(CalcIsAttackCriticalHelper, "CalcCritical"); calcIsAttackCriticalMeleeDetour = DETOUR_CREATE_MEMBER(CalcIsAttackCriticalHelperMelee, "CalcCriticalMelee"); @@ -214,17 +214,33 @@ void InitialiseCritDetours() HookCreated = true; } - if (!HookCreated) + if (HookCreated) { - g_pSM->LogError(myself, "No critical hit forwards could be initialized - Disabled critical hit hooks"); - return; + return true; } + g_pSM->LogError(myself, "No critical hit forwards could be initialized - Disabled critical hit hooks"); + + return false; } void RemoveCritDetours() { - calcIsAttackCriticalDetour->Destroy(); - calcIsAttackCriticalMeleeDetour->Destroy(); - calcIsAttackCriticalBowDetour->Destroy(); + if (calcIsAttackCriticalDetour != NULL) + { + calcIsAttackCriticalDetour->Destroy(); + calcIsAttackCriticalDetour = NULL; + } + + if (calcIsAttackCriticalMeleeDetour != NULL) + { + calcIsAttackCriticalMeleeDetour->Destroy(); + calcIsAttackCriticalMeleeDetour = NULL; + } + + if (calcIsAttackCriticalBowDetour != NULL) + { + calcIsAttackCriticalBowDetour->Destroy(); + calcIsAttackCriticalBowDetour = NULL; + } } diff --git a/extensions/tf2/criticals.h b/extensions/tf2/criticals.h index 8aac6f48..e0f5722d 100644 --- a/extensions/tf2/criticals.h +++ b/extensions/tf2/criticals.h @@ -37,7 +37,7 @@ #include #include "CDetour/detours.h" -void InitialiseCritDetours(); +bool InitialiseCritDetours(); void RemoveCritDetours(); extern IForward *g_critForward; diff --git a/extensions/tf2/extension.cpp b/extensions/tf2/extension.cpp index e96c56ca..df98a2e8 100644 --- a/extensions/tf2/extension.cpp +++ b/extensions/tf2/extension.cpp @@ -309,21 +309,19 @@ void TF2Tools::OnPluginLoaded(IPlugin *plugin) { if (!m_CritDetoursEnabled && g_critForward->GetFunctionCount()) { - InitialiseCritDetours(); - m_CritDetoursEnabled = true; + m_CritDetoursEnabled = InitialiseCritDetours(); } + if (!m_GetHolidayDetourEnabled && g_getHolidayForward->GetFunctionCount()) { - InitialiseGetHolidayDetour(); - m_GetHolidayDetourEnabled = true; + m_GetHolidayDetourEnabled = InitialiseGetHolidayDetour(); } - if (!m_RulesDetoursEnabled) + + if (!m_RulesDetoursEnabled + && ( g_waitingPlayersStartForward->GetFunctionCount() || g_waitingPlayersEndForward->GetFunctionCount() ) + ) { - if(g_waitingPlayersStartForward->GetFunctionCount() || g_waitingPlayersEndForward->GetFunctionCount()) - { - InitialiseRulesDetours(); - m_RulesDetoursEnabled = true; - } + m_RulesDetoursEnabled = InitialiseRulesDetours(); } } @@ -341,7 +339,7 @@ void TF2Tools::OnPluginUnloaded(IPlugin *plugin) } if (m_RulesDetoursEnabled) { - if(!g_waitingPlayersStartForward->GetFunctionCount() || !g_waitingPlayersEndForward->GetFunctionCount()) + if (!g_waitingPlayersStartForward->GetFunctionCount() && !g_waitingPlayersEndForward->GetFunctionCount()) { RemoveRulesDetours(); m_RulesDetoursEnabled = false; diff --git a/extensions/tf2/gameplayrules.cpp b/extensions/tf2/gameplayrules.cpp index 908e54c7..7451f82c 100644 --- a/extensions/tf2/gameplayrules.cpp +++ b/extensions/tf2/gameplayrules.cpp @@ -64,17 +64,18 @@ DETOUR_DECL_MEMBER1(SetInWaitingForPlayers, void, bool, bWaitingForPlayers) } } -void InitialiseRulesDetours() +bool InitialiseRulesDetours() { setInWaitingForPlayersDetour = DETOUR_CREATE_MEMBER(SetInWaitingForPlayers, "SetInWaitingForPlayers"); if (setInWaitingForPlayersDetour != NULL) { setInWaitingForPlayersDetour->EnableDetour(); - return; + return true; } g_pSM->LogError(myself, "No Gameplay Rules detours could be initialized - Disabled Gameplay Rules functions"); + return false; } void RemoveRulesDetours() diff --git a/extensions/tf2/gameplayrules.h b/extensions/tf2/gameplayrules.h index 2f142e05..fd5672d5 100644 --- a/extensions/tf2/gameplayrules.h +++ b/extensions/tf2/gameplayrules.h @@ -37,7 +37,7 @@ #include #include "CDetour/detours.h" -void InitialiseRulesDetours(); +bool InitialiseRulesDetours(); void RemoveRulesDetours(); extern IForward *g_waitingPlayersStartForward; diff --git a/extensions/tf2/holiday.cpp b/extensions/tf2/holiday.cpp index 549d2d3c..5ce1b632 100644 --- a/extensions/tf2/holiday.cpp +++ b/extensions/tf2/holiday.cpp @@ -58,17 +58,18 @@ DETOUR_DECL_STATIC0(GetHoliday, int) return actualres; } -void InitialiseGetHolidayDetour() +bool InitialiseGetHolidayDetour() { getHolidayDetour = DETOUR_CREATE_STATIC(GetHoliday, "GetHoliday"); - if (!getHolidayDetour) + if (getHolidayDetour != NULL) { - g_pSM->LogError(myself, "GetHoliday detour failed"); - return; + getHolidayDetour->EnableDetour(); + return true; } - getHolidayDetour->EnableDetour(); + g_pSM->LogError(myself, "GetHoliday detour failed"); + return false; } void RemoveGetHolidayDetour() diff --git a/extensions/tf2/holiday.h b/extensions/tf2/holiday.h index ad20bf63..5075062c 100644 --- a/extensions/tf2/holiday.h +++ b/extensions/tf2/holiday.h @@ -37,7 +37,7 @@ #include #include "CDetour/detours.h" -void InitialiseGetHolidayDetour(); +bool InitialiseGetHolidayDetour(); void RemoveGetHolidayDetour(); extern IForward *g_getHolidayForward;