From ae1a266dac76163fd1e4eec62e77a284fee98861 Mon Sep 17 00:00:00 2001 From: def Date: Sat, 10 Oct 2020 23:46:01 +0200 Subject: [PATCH] CCharacterCore::Tick caused out of bounds src/game/teamscore.cpp:27:78: runtime error: index -1 out of bounds for type 'int const[64]' #0 0xf5b948 in CTeamsCore::CanKeepHook(int, int) const src/game/teamscore.cpp:27 #1 0xf46fe1 in CCharacterCore::Tick(bool) src/game/gamecore.cpp:325 #2 0xaf7366 in CGameClient::DetectStrongHook() src/game/client/gameclient.cpp:2441 #3 0xadd734 in CGameClient::UpdatePrediction() src/game/client/gameclient.cpp:2249 #4 0xad6e17 in CGameClient::OnNewSnapshot() src/game/client/gameclient.cpp:1675 #5 0x522d55 in CClient::Update() src/engine/client/client.cpp:2767 #6 0x5333e4 in CClient::Run() src/engine/client/client.cpp:3237 #7 0x557fda in main src/engine/client/client.cpp:4341 #8 0x7f55e8c75cc9 in __libc_start_main ../csu/libc-start.c:308 #9 0x433e29 in _start (build/DDNet+0x433e29) src/game/teamscore.cpp:34:78: runtime error: index -1 out of bounds for type 'int const[64]' #0 0xf5be68 in CTeamsCore::CanCollide(int, int) const src/game/teamscore.cpp:34 #1 0xf46458 in CCharacterCore::Tick(bool) src/game/gamecore.cpp:271 #2 0xaf7374 in CGameClient::DetectStrongHook() src/game/client/gameclient.cpp:2442 #3 0xadd734 in CGameClient::UpdatePrediction() src/game/client/gameclient.cpp:2249 #4 0xad6e17 in CGameClient::OnNewSnapshot() src/game/client/gameclient.cpp:1675 #5 0x522d55 in CClient::Update() src/engine/client/client.cpp:2767 #6 0x5333e4 in CClient::Run() src/engine/client/client.cpp:3237 #7 0x557fda in main src/engine/client/client.cpp:4341 #8 0x7f55e8c75cc9 in __libc_start_main ../csu/libc-start.c:308 #9 0x433e29 in _start (build/DDNet+0x433e29) --- src/game/gamecore.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/game/gamecore.cpp b/src/game/gamecore.cpp index 4b6f99f3b..85aa00b04 100644 --- a/src/game/gamecore.cpp +++ b/src/game/gamecore.cpp @@ -268,7 +268,7 @@ void CCharacterCore::Tick(bool UseInput) for(int i = 0; i < MAX_CLIENTS; i++) { CCharacterCore *pCharCore = m_pWorld->m_apCharacters[i]; - if(!pCharCore || pCharCore == this || (!(m_Super || pCharCore->m_Super) && (!m_pTeams->CanCollide(i, m_Id) || pCharCore->m_Solo || m_Solo))) + if(!pCharCore || pCharCore == this || (!(m_Super || pCharCore->m_Super) && ((m_Id != -1 && !m_pTeams->CanCollide(i, m_Id)) || pCharCore->m_Solo || m_Solo))) continue; vec2 ClosestPoint = closest_point_on_line(m_HookPos, NewPos, pCharCore->m_Pos); @@ -322,7 +322,7 @@ void CCharacterCore::Tick(bool UseInput) if(m_HookedPlayer != -1) { CCharacterCore *pCharCore = m_pWorld->m_apCharacters[m_HookedPlayer]; - if(pCharCore && m_pTeams->CanKeepHook(m_Id, pCharCore->m_Id)) + if(pCharCore && m_Id != -1 && m_pTeams->CanKeepHook(m_Id, pCharCore->m_Id)) m_HookPos = pCharCore->m_Pos; else { @@ -575,7 +575,7 @@ bool CCharacterCore::IsSwitchActiveCb(int Number, void *pUser) { CCharacterCore *pThis = (CCharacterCore *)pUser; if(pThis->Collision()->m_pSwitchers) - if(pThis->m_pTeams->Team(pThis->m_Id) != (pThis->m_pTeams->m_IsDDRace16 ? VANILLA_TEAM_SUPER : TEAM_SUPER)) + if(pThis->m_Id != -1 && pThis->m_pTeams->Team(pThis->m_Id) != (pThis->m_pTeams->m_IsDDRace16 ? VANILLA_TEAM_SUPER : TEAM_SUPER)) return pThis->Collision()->m_pSwitchers[Number].m_Status[pThis->m_pTeams->Team(pThis->m_Id)]; return false; }