[Crash] Add additional raid integrity checks on Bot Spawn. (#3295)

* simple cleanup before changes

* can't be in a raid yet

* change to sizeof

* change to use sizeof
This commit is contained in:
Aeadoin 2023-04-16 10:06:19 -04:00 committed by GitHub
parent d45a57056a
commit 93db35658a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 22 additions and 25 deletions

View File

@ -422,12 +422,6 @@ Bot::Bot(uint32 botID, uint32 botOwnerCharacterID, uint32 botSpellsID, double to
} }
cur_end = max_end; cur_end = max_end;
// Safety Check to confirm we have a valid raid
if (HasRaid() && !GetRaid()->IsRaidMember(GetBotOwner()->CastToClient())) {
Bot::RemoveBotFromRaid(this);
}
} }
Bot::~Bot() { Bot::~Bot() {
@ -3307,11 +3301,16 @@ bool Bot::Spawn(Client* botCharacterOwner) {
} }
if (auto raid = entity_list.GetRaidByBotName(GetName())) { if (auto raid = entity_list.GetRaidByBotName(GetName())) {
raid->VerifyRaid(); // Safety Check to confirm we have a valid raid
SetRaidGrouped(true); if (raid->IsRaidMember(GetBotOwner()->CastToClient())) {
Bot::RemoveBotFromRaid(this);
} else {
raid->LearnMembers();
SetRaidGrouped(true);
}
} }
else if (auto group = entity_list.GetGroupByMobName(GetName())) { else if (auto group = entity_list.GetGroupByMobName(GetName())) {
group->VerifyGroup(); group->LearnMembers();
SetGrouped(true); SetGrouped(true);
} }

View File

@ -6999,7 +6999,7 @@ void Client::Handle_OP_GroupDisband(const EQApplicationPacket *app)
//we have a raid.. see if we're in a raid group //we have a raid.. see if we're in a raid group
uint32 grp = raid->GetGroup(memberToDisband->GetName()); uint32 grp = raid->GetGroup(memberToDisband->GetName());
bool wasGrpLdr = raid->members[raid->GetPlayerIndex(memberToDisband->GetName())].is_group_leader; bool wasGrpLdr = raid->members[raid->GetPlayerIndex(memberToDisband->GetName())].is_group_leader;
if (grp < 12) { if (grp < MAX_RAID_GROUPS) {
if (wasGrpLdr) { if (wasGrpLdr) {
raid->SetGroupLeader(memberToDisband->GetName(), false); raid->SetGroupLeader(memberToDisband->GetName(), false);
for (int x = 0; x < MAX_RAID_MEMBERS; x++) { for (int x = 0; x < MAX_RAID_MEMBERS; x++) {

View File

@ -1126,8 +1126,8 @@ void Raid::SendRaidAdd(const char *who, Client *to)
auto ram = (RaidAddMember_Struct*)outapp->pBuffer; auto ram = (RaidAddMember_Struct*)outapp->pBuffer;
ram->raidGen.action = raidAdd; ram->raidGen.action = raidAdd;
ram->raidGen.parameter = m.group_number; ram->raidGen.parameter = m.group_number;
strn0cpy(ram->raidGen.leader_name, m.member_name, 64); strn0cpy(ram->raidGen.leader_name, m.member_name, sizeof(ram->raidGen.leader_name));
strn0cpy(ram->raidGen.player_name, m.member_name, 64); strn0cpy(ram->raidGen.player_name, m.member_name, sizeof(ram->raidGen.player_name));
ram->_class = m._class; ram->_class = m._class;
ram->level = m.level; ram->level = m.level;
ram->isGroupLeader = m.is_group_leader; ram->isGroupLeader = m.is_group_leader;
@ -1148,8 +1148,8 @@ void Raid::SendRaidAddAll(const char *who)
auto ram = (RaidAddMember_Struct*)outapp->pBuffer; auto ram = (RaidAddMember_Struct*)outapp->pBuffer;
ram->raidGen.action = raidAdd; ram->raidGen.action = raidAdd;
ram->raidGen.parameter = m.group_number; ram->raidGen.parameter = m.group_number;
strcpy(ram->raidGen.leader_name, m.member_name); strn0cpy(ram->raidGen.leader_name, m.member_name, sizeof(ram->raidGen.leader_name));
strcpy(ram->raidGen.player_name, m.member_name); strn0cpy(ram->raidGen.player_name, m.member_name, sizeof(ram->raidGen.player_name));
ram->isGroupLeader = m.is_group_leader; ram->isGroupLeader = m.is_group_leader;
ram->_class = m._class; ram->_class = m._class;
ram->level = m.level; ram->level = m.level;
@ -1361,33 +1361,31 @@ void Raid::SendGroupUpdate(Client *to)
auto outapp = new EQApplicationPacket(OP_GroupUpdate, sizeof(GroupUpdate2_Struct)); auto outapp = new EQApplicationPacket(OP_GroupUpdate, sizeof(GroupUpdate2_Struct));
auto gu = (GroupUpdate2_Struct*)outapp->pBuffer; auto gu = (GroupUpdate2_Struct*)outapp->pBuffer;
gu->action = groupActUpdate; gu->action = groupActUpdate;
int i = 0;
uint32 grp = GetGroup(to->GetName()); uint32 grp = GetGroup(to->GetName());
if (grp >= MAX_RAID_GROUPS) { if (grp >= MAX_RAID_GROUPS) {
safe_delete(outapp); safe_delete(outapp);
return; return;
} }
int i = 0;
for (const auto& m : members) { for (const auto& m : members) {
if (m.group_number == grp && strlen(m.member_name) > 0) { if (m.group_number == grp && strlen(m.member_name) > 0) {
if (m.is_group_leader) { if (m.is_group_leader) {
strn0cpy(gu->leadersname, m.member_name, 64); strn0cpy(gu->leadersname, m.member_name, sizeof(gu->leadersname));
if (strcmp(to->GetName(), m.member_name) != 0) { if (strcmp(to->GetName(), m.member_name) != 0) {
strn0cpy(gu->membername[i], m.member_name, 64); strn0cpy(gu->membername[i], m.member_name, sizeof(gu->membername[i]));
i++; ++i;
} }
} }
else { else if (strcmp(to->GetName(), m.member_name) != 0) {
if (strcmp(to->GetName(), m.member_name) != 0) { strn0cpy(gu->membername[i], m.member_name, sizeof(gu->membername[i]));
strn0cpy(gu->membername[i], m.member_name, 64); ++i;
i++;
}
} }
} }
} }
if (strlen(gu->leadersname) < 1) { if (strlen(gu->leadersname) < 1) {
strn0cpy(gu->leadersname, to->GetName(), 64); strn0cpy(gu->leadersname, to->GetName(), sizeof(gu->leadersname));
} }
strn0cpy(gu->yourname, to->GetName(), 64); strn0cpy(gu->yourname, to->GetName(), 64);
@ -1404,7 +1402,7 @@ void Raid::GroupUpdate(uint32 gid, bool initial)
} }
for (const auto& m : members) { for (const auto& m : members) {
if (strlen(m.member_name) > 0 && m.group_number == gid && m.member) { if (m.member && m.group_number == gid && strlen(m.member_name) > 0) {
SendGroupUpdate(m.member); SendGroupUpdate(m.member);
SendGroupLeadershipAA(m.member, gid); SendGroupLeadershipAA(m.member, gid);
} }