Skip to content

Commit 76ac425

Browse files
authored
Merge pull request ddnet#9264 from Robyt3/Client-Dummy-Id-Checks
Fix out-of-bounds reads during dummy connecting
2 parents 97f21c9 + b8ad945 commit 76ac425

File tree

6 files changed

+20
-18
lines changed

6 files changed

+20
-18
lines changed

src/game/client/components/chat.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -768,12 +768,12 @@ void CChat::AddLine(int ClientId, int Team, const char *pLine)
768768
// check for highlighted name
769769
if(Client()->State() != IClient::STATE_DEMOPLAYBACK)
770770
{
771-
if(ClientId >= 0 && ClientId != m_pClient->m_aLocalIds[0] && (!m_pClient->Client()->DummyConnected() || ClientId != m_pClient->m_aLocalIds[1]))
771+
if(ClientId >= 0 && ClientId != m_pClient->m_aLocalIds[0] && ClientId != m_pClient->m_aLocalIds[1])
772772
{
773-
// main character
774-
Highlighted |= LineShouldHighlight(pLine, m_pClient->m_aClients[m_pClient->m_aLocalIds[0]].m_aName);
775-
// dummy
776-
Highlighted |= m_pClient->Client()->DummyConnected() && LineShouldHighlight(pLine, m_pClient->m_aClients[m_pClient->m_aLocalIds[1]].m_aName);
773+
for(int LocalId : m_pClient->m_aLocalIds)
774+
{
775+
Highlighted |= LocalId >= 0 && LineShouldHighlight(pLine, m_pClient->m_aClients[LocalId].m_aName);
776+
}
777777
}
778778
}
779779
else

src/game/client/components/emoticon.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,7 @@ void CEmoticon::OnRender()
167167
}
168168
Graphics()->WrapNormal();
169169

170-
if(GameClient()->m_GameInfo.m_AllowEyeWheel && g_Config.m_ClEyeWheel)
170+
if(GameClient()->m_GameInfo.m_AllowEyeWheel && g_Config.m_ClEyeWheel && m_pClient->m_aLocalIds[g_Config.m_ClDummy] >= 0)
171171
{
172172
Graphics()->TextureClear();
173173
Graphics()->QuadsBegin();

src/game/client/components/nameplates.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -288,7 +288,7 @@ void CNamePlates::RenderNamePlateGame(vec2 Position, const CNetObj_PlayerInfo *p
288288
if(Data.m_ShowDirection)
289289
{
290290
if(Client()->State() != IClient::STATE_DEMOPLAYBACK &&
291-
Client()->DummyConnected() && pPlayerInfo->m_ClientId == m_pClient->m_aLocalIds[!g_Config.m_ClDummy])
291+
pPlayerInfo->m_ClientId == m_pClient->m_aLocalIds[!g_Config.m_ClDummy])
292292
{
293293
const auto &InputData = m_pClient->m_Controls.m_aInputData[!g_Config.m_ClDummy];
294294
Data.m_DirLeft = InputData.m_Direction == -1;

src/game/client/components/players.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -794,7 +794,7 @@ void CPlayers::RenderPlayer(
794794
Graphics()->QuadsSetRotation(0);
795795
}
796796

797-
if(g_Config.m_ClAfkEmote && m_pClient->m_aClients[ClientId].m_Afk && !(Client()->DummyConnected() && ClientId == m_pClient->m_aLocalIds[!g_Config.m_ClDummy]))
797+
if(g_Config.m_ClAfkEmote && m_pClient->m_aClients[ClientId].m_Afk && ClientId != m_pClient->m_aLocalIds[!g_Config.m_ClDummy])
798798
{
799799
int CurEmoticon = (SPRITE_ZZZ - SPRITE_OOP);
800800
Graphics()->TextureSet(GameClient()->m_EmoticonsSkin.m_aSpriteEmoticons[CurEmoticon]);

src/game/client/components/scoreboard.cpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -211,10 +211,9 @@ void CScoreboard::RenderSpectators(CUIRect Spectators)
211211

212212
{
213213
const char *pClanName = GameClient()->m_aClients[pInfo->m_ClientId].m_aClan;
214-
215214
if(pClanName[0] != '\0')
216215
{
217-
if(str_comp(pClanName, GameClient()->m_aClients[GameClient()->m_aLocalIds[g_Config.m_ClDummy]].m_aClan) == 0)
216+
if(GameClient()->m_aLocalIds[g_Config.m_ClDummy] >= 0 && str_comp(pClanName, GameClient()->m_aClients[GameClient()->m_aLocalIds[g_Config.m_ClDummy]].m_aClan) == 0)
218217
{
219218
TextRender()->TextColor(color_cast<ColorRGBA>(ColorHSLA(g_Config.m_ClSameClanColor)));
220219
}
@@ -558,7 +557,7 @@ void CScoreboard::RenderScoreboard(CUIRect Scoreboard, int Team, int CountStart,
558557

559558
// clan
560559
{
561-
if(str_comp(ClientData.m_aClan, GameClient()->m_aClients[GameClient()->m_aLocalIds[g_Config.m_ClDummy]].m_aClan) == 0)
560+
if(GameClient()->m_aLocalIds[g_Config.m_ClDummy] >= 0 && str_comp(ClientData.m_aClan, GameClient()->m_aClients[GameClient()->m_aLocalIds[g_Config.m_ClDummy]].m_aClan) == 0)
562561
{
563562
TextRender()->TextColor(color_cast<ColorRGBA>(ColorHSLA(g_Config.m_ClSameClanColor)));
564563
}

src/game/client/gameclient.cpp

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -497,6 +497,10 @@ int CGameClient::OnSnapInput(int *pData, bool Dummy, bool Force)
497497
{
498498
return m_Controls.SnapInput(pData);
499499
}
500+
if(m_aLocalIds[!g_Config.m_ClDummy] < 0)
501+
{
502+
return 0;
503+
}
500504

501505
if(!g_Config.m_ClDummyHammer)
502506
{
@@ -530,11 +534,9 @@ int CGameClient::OnSnapInput(int *pData, bool Dummy, bool Force)
530534
m_DummyInput.m_WantedWeapon = WEAPON_HAMMER + 1;
531535
}
532536

533-
vec2 MainPos = m_LocalCharacterPos;
534-
vec2 DummyPos = m_aClients[m_aLocalIds[!g_Config.m_ClDummy]].m_Predicted.m_Pos;
535-
vec2 Dir = MainPos - DummyPos;
536-
m_HammerInput.m_TargetX = (int)(Dir.x);
537-
m_HammerInput.m_TargetY = (int)(Dir.y);
537+
const vec2 Dir = m_LocalCharacterPos - m_aClients[m_aLocalIds[!g_Config.m_ClDummy]].m_Predicted.m_Pos;
538+
m_HammerInput.m_TargetX = (int)Dir.x;
539+
m_HammerInput.m_TargetY = (int)Dir.y;
538540

539541
mem_copy(pData, &m_HammerInput, sizeof(m_HammerInput));
540542
return sizeof(m_HammerInput);
@@ -807,7 +809,7 @@ void CGameClient::OnRender()
807809
g_Config.m_ClDummy = 0;
808810

809811
// resend player and dummy info if it was filtered by server
810-
if(Client()->State() == IClient::STATE_ONLINE && !m_Menus.IsActive() && WasNewTick)
812+
if(m_aLocalIds[0] >= 0 && Client()->State() == IClient::STATE_ONLINE && !m_Menus.IsActive() && WasNewTick)
811813
{
812814
if(m_aCheckInfo[0] == 0)
813815
{
@@ -839,7 +841,7 @@ void CGameClient::OnRender()
839841
m_aCheckInfo[0] -= minimum(Client()->GameTick(0) - Client()->PrevGameTick(0), m_aCheckInfo[0]);
840842
}
841843

842-
if(Client()->DummyConnected())
844+
if(m_aLocalIds[1] >= 0)
843845
{
844846
if(m_aCheckInfo[1] == 0)
845847
{
@@ -876,6 +878,7 @@ void CGameClient::OnRender()
876878

877879
void CGameClient::OnDummyDisconnect()
878880
{
881+
m_aLocalIds[1] = -1;
879882
m_aDDRaceMsgSent[1] = false;
880883
m_aShowOthers[1] = SHOW_OTHERS_NOT_SET;
881884
m_aLastNewPredictedTick[1] = -1;

0 commit comments

Comments
 (0)