From fd5117058031deb8017cbd048c61a38282322f5b Mon Sep 17 00:00:00 2001 From: Scott Ludwig Date: Fri, 1 Jan 2016 14:23:25 -0800 Subject: [PATCH] Fix referencing freed memory during PlayersUpdate message --- game/gameform.cpp | 45 ++++++++++++++++++++++----------------------- game/gameform.h | 9 ++++++++- 2 files changed, 30 insertions(+), 24 deletions(-) diff --git a/game/gameform.cpp b/game/gameform.cpp index 0e176ee..c9d3fc2 100644 --- a/game/gameform.cpp +++ b/game/gameform.cpp @@ -339,33 +339,34 @@ void GameForm::OnBeginGameFail() { pbtn->Show(true); } -std::vector > GameForm::GetPlayerReadies() { - std::vector > readies; +std::vector GameForm::GetPlayerReadies() { + std::vector readies; Player *pplr = NULL; while ((pplr = gplrm.GetNextHumanPlayer(pplr)) != NULL) { if (pplr->GetFlags() & (kfPlrUnfulfilled | kfPlrComputer)) { continue; } - readies.push_back(std::make_pair(pplr, - (pplr->GetFlags() & kfPlrReady) != 0)); + PlayerReady rdy; + strcpy(rdy.szName, pplr->GetName()); + rdy.side = pplr->GetSide(); + rdy.fReady = (pplr->GetFlags() & kfPlrReady) != 0; + rdy.fLocal = (pplr == gpplrLocal); + readies.push_back(rdy); } return readies; } void GameForm::OnPlayersUpdate(PlayersUpdateNetMessage *pnm) { - std::vector > oldreadies = - GetPlayerReadies(); + std::vector oldreadies = GetPlayerReadies(); gplrm.Init((PlayersUpdateNetMessage *)pnm); - std::vector > newreadies = - GetPlayerReadies(); + std::vector newreadies = GetPlayerReadies(); // Announce joins and leaves bool sfx = false; for (int i = 0; i < newreadies.size(); i++) { bool found = false; for (int j = 0; j < oldreadies.size(); j++) { - if (strcmp(newreadies[i].first->GetName(), - oldreadies[j].first->GetName()) == 0) { + if (strcmp(newreadies[i].szName, oldreadies[j].szName) == 0) { found = true; break; } @@ -373,12 +374,12 @@ void GameForm::OnPlayersUpdate(PlayersUpdateNetMessage *pnm) { if (!found) { chatter_.AddChat("", base::Format::ToString( "%s (%s) joined this game.", - newreadies[i].first->GetName(), - GetColorName(newreadies[i].first->GetSide())), + newreadies[i].szName, + GetColorName(newreadies[i].side)), true); // sfx on add if it isn't this player - if (newreadies[i].first != gpplrLocal) { + if (!newreadies[i].fLocal) { sfx = true; } } @@ -386,8 +387,7 @@ void GameForm::OnPlayersUpdate(PlayersUpdateNetMessage *pnm) { for (int j = 0; j < oldreadies.size(); j++) { bool found = false; for (int i = 0; i < newreadies.size(); i++) { - if (strcmp(newreadies[i].first->GetName(), - oldreadies[j].first->GetName()) == 0) { + if (strcmp(newreadies[i].szName, oldreadies[j].szName) == 0) { found = true; break; } @@ -395,8 +395,8 @@ void GameForm::OnPlayersUpdate(PlayersUpdateNetMessage *pnm) { if (!found) { chatter_.AddChat("", base::Format::ToString( "%s (%s) left this game.", - oldreadies[j].first->GetName(), - GetColorName(oldreadies[j].first->GetSide())), + oldreadies[j].szName, + GetColorName(oldreadies[j].side)), true); sfx = true; } @@ -410,22 +410,21 @@ void GameForm::OnPlayersUpdate(PlayersUpdateNetMessage *pnm) { bool found = false; bool ready = false; for (int j = 0; j < oldreadies.size(); j++) { - if (strcmp(newreadies[i].first->GetName(), - oldreadies[j].first->GetName()) == 0) { - if (!oldreadies[j].second && newreadies[i].second) { + if (strcmp(newreadies[i].szName, oldreadies[j].szName) == 0) { + if (!oldreadies[j].fReady && newreadies[i].fReady) { ready = true; break; } found = true; } } - if (!found && newreadies[i].second) { + if (!found && newreadies[i].fReady) { ready = true; } if (ready) { chatter_.AddChat("", base::Format::ToString("%s (%s) is READY.", - newreadies[i].first->GetName(), - GetColorName(newreadies[i].first->GetSide())), true); + newreadies[i].szName, + GetColorName(newreadies[i].side)), true); } } diff --git a/game/gameform.h b/game/gameform.h index 1c209c7..04bad45 100644 --- a/game/gameform.h +++ b/game/gameform.h @@ -65,7 +65,14 @@ private: int GetPlayerCountNeeded(bool fReady); void ShowOrHideBeginGameButton(); void RefreshPlayerList(); - std::vector > GetPlayerReadies(); + + struct PlayerReady { + char szName[kcbPlayerName]; + Side side; + bool fLocal; + bool fReady; + }; + std::vector GetPlayerReadies(); Chatter& chatter_; LoginHandler& handler_;