From 224c26620ef7c855bff325ccb6384daf08c264b3 Mon Sep 17 00:00:00 2001 From: "Michael Cook (mackal)" Date: Fri, 5 Mar 2021 15:24:40 -0500 Subject: [PATCH 1/4] Clean up MOTD processing --- zone/worldserver.cpp | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/zone/worldserver.cpp b/zone/worldserver.cpp index 804a680e2..0eb8000b0 100644 --- a/zone/worldserver.cpp +++ b/zone/worldserver.cpp @@ -473,20 +473,16 @@ void WorldServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p) break; } case ServerOP_Motd: { - ServerMotd_Struct* smotd = (ServerMotd_Struct*)pack->pBuffer; - EQApplicationPacket *outapp; - outapp = new EQApplicationPacket(OP_MOTD); - char tmp[500] = { 0 }; - sprintf(tmp, "%s", smotd->motd); + if (pack->size != sizeof(ServerMotd_Struct)) + break; - outapp->size = strlen(tmp) + 1; - outapp->pBuffer = new uchar[outapp->size]; - memset(outapp->pBuffer, 0, outapp->size); - strcpy((char*)outapp->pBuffer, tmp); + ServerMotd_Struct *smotd = (ServerMotd_Struct *)pack->pBuffer; + SerializeBuffer buf(100); + buf.WriteString(smotd->motd); - entity_list.QueueClients(0, outapp); - safe_delete(outapp); + auto outapp = std::make_unique(OP_MOTD, buf); + entity_list.QueueClients(0, outapp.get()); break; } case ServerOP_ShutdownAll: { From 316336d1cf0decf8135a9ff12f518b4c6e8eff60 Mon Sep 17 00:00:00 2001 From: "Michael Cook (mackal)" Date: Fri, 5 Mar 2021 15:25:32 -0500 Subject: [PATCH 2/4] Nuke ZoneDatabase::GetEventLogs This wasn't called anywhere and was throwing format-overflow warnings --- common/database.h | 18 ------------------ zone/zonedb.cpp | 47 ----------------------------------------------- zone/zonedb.h | 2 -- 3 files changed, 67 deletions(-) diff --git a/common/database.h b/common/database.h index 35d70407f..db428b981 100644 --- a/common/database.h +++ b/common/database.h @@ -45,24 +45,6 @@ namespace EQ class InventoryProfile; } -struct EventLogDetails_Struct { - uint32 id; - char accountname[64]; - uint32 account_id; - int16 status; - char charactername[64]; - char targetname[64]; - char timestamp[64]; - char descriptiontype[64]; - char details[128]; -}; - -struct CharacterEventLog_Struct { - uint32 count; - uint8 eventid; - EventLogDetails_Struct eld[255]; -}; - struct npcDecayTimes_Struct { uint16 minlvl; uint16 maxlvl; diff --git a/zone/zonedb.cpp b/zone/zonedb.cpp index 447d75ba2..27f54862b 100755 --- a/zone/zonedb.cpp +++ b/zone/zonedb.cpp @@ -639,53 +639,6 @@ void ZoneDatabase::SetDoorPlace(uint8 value,uint8 door_id,const char* zone_name) door_isopen_array[door_id] = value; } -void ZoneDatabase::GetEventLogs(const char* name,char* target,uint32 account_id,uint8 eventid,char* detail,char* timestamp, CharacterEventLog_Struct* cel) -{ - char modifications[200]; - if(strlen(name) != 0) - sprintf(modifications,"charname=\'%s\'",name); - else if(account_id != 0) - sprintf(modifications,"accountid=%i",account_id); - - if(strlen(target) != 0) - sprintf(modifications,"%s AND target LIKE \'%%%s%%\'",modifications,target); - - if(strlen(detail) != 0) - sprintf(modifications,"%s AND description LIKE \'%%%s%%\'",modifications,detail); - - if(strlen(timestamp) != 0) - sprintf(modifications,"%s AND time LIKE \'%%%s%%\'",modifications,timestamp); - - if(eventid == 0) - eventid =1; - sprintf(modifications,"%s AND event_nid=%i",modifications,eventid); - - std::string query = StringFormat("SELECT id, accountname, accountid, status, charname, target, " - "time, descriptiontype, description FROM eventlog WHERE %s", modifications); - auto results = QueryDatabase(query); - if (!results.Success()) - return; - - int index = 0; - for (auto row = results.begin(); row != results.end(); ++row, ++index) { - if(index == 255) - break; - - cel->eld[index].id = atoi(row[0]); - strn0cpy(cel->eld[index].accountname,row[1],64); - cel->eld[index].account_id = atoi(row[2]); - cel->eld[index].status = atoi(row[3]); - strn0cpy(cel->eld[index].charactername,row[4],64); - strn0cpy(cel->eld[index].targetname,row[5],64); - sprintf(cel->eld[index].timestamp,"%s",row[6]); - strn0cpy(cel->eld[index].descriptiontype,row[7],64); - strn0cpy(cel->eld[index].details,row[8],128); - cel->eventid = eventid; - cel->count = index + 1; - } - -} - // Load child objects for a world container (i.e., forge, bag dropped to ground, etc) void ZoneDatabase::LoadWorldContainer(uint32 parentid, EQ::ItemInstance* container) { diff --git a/zone/zonedb.h b/zone/zonedb.h index c32a92f77..d2fae4232 100644 --- a/zone/zonedb.h +++ b/zone/zonedb.h @@ -23,7 +23,6 @@ class Petition; class Spawn2; class SpawnGroupList; class Trap; -struct CharacterEventLog_Struct; struct Door; struct ExtendedProfile_Struct; struct NPCType; @@ -551,7 +550,6 @@ public: * REALLY HAS NO BETTER SECTION */ bool logevents(const char* accountname,uint32 accountid,uint8 status,const char* charname,const char* target, const char* descriptiontype, const char* description,int event_nid); - void GetEventLogs(const char* name,char* target,uint32 account_id=0,uint8 eventid=0,char* detail=0,char* timestamp=0, CharacterEventLog_Struct* cel=0); uint32 GetKarma(uint32 acct_id); void UpdateKarma(uint32 acct_id, uint32 amount); From f7d40ec88e5e0c61b58de223e55a07e7d75c1b5e Mon Sep 17 00:00:00 2001 From: "Michael Cook (mackal)" Date: Fri, 5 Mar 2021 15:43:06 -0500 Subject: [PATCH 3/4] Clean up Merc::LoadMerc lastname processing This is still less than ideal, but client's name restrictions should prevent this from being an actual problem --- zone/merc.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/zone/merc.cpp b/zone/merc.cpp index bb5cf3871..32f5995a8 100644 --- a/zone/merc.cpp +++ b/zone/merc.cpp @@ -4791,7 +4791,12 @@ Merc* Merc::LoadMerc(Client *c, MercTemplate* merc_template, uint32 merchant_id, tmpsize = c->GetMercInfo().MercSize; } - sprintf(npc_type->lastname, "%s's Mercenary", c->GetName()); + std::string tmp_lastname = c->GetName(); + tmp_lastname += "'s Mercenary"; + + // not sure what to do if too long + if (tmp_lastname.length() < sizeof(npc_type->lastname)) + strn0cpy(npc_type->lastname, tmp_lastname.c_str(), sizeof(npc_type->lastname)); npc_type->gender = tmpgender; npc_type->size = tmpsize; npc_type->loottable_id = 0; // Loottable has to be 0, otherwise we'll be leavin' some corpses! From 0b8220be322360e4cbb2f6f1b820a41f8cad0e27 Mon Sep 17 00:00:00 2001 From: "Michael Cook (mackal)" Date: Fri, 5 Mar 2021 15:51:59 -0500 Subject: [PATCH 4/4] Clean up last name handling in NPC::PetOnSpawn Same as last time --- zone/npc.cpp | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/zone/npc.cpp b/zone/npc.cpp index ff46c1331..1a4837721 100644 --- a/zone/npc.cpp +++ b/zone/npc.cpp @@ -2254,8 +2254,12 @@ void NPC::PetOnSpawn(NewSpawn_Struct* ns) if (RuleB(Pets, UnTargetableSwarmPet)) { ns->spawn.bodytype = 11; - if(!IsCharmed() && swarmOwner->IsClient()) - sprintf(ns->spawn.lastName, "%s's Pet", swarmOwner->GetName()); + if(!IsCharmed() && swarmOwner->IsClient()) { + std::string tmp_lastname = swarmOwner->GetName(); + tmp_lastname += "'s Pet"; + if (tmp_lastname.size() < sizeof(ns->spawn.lastName)) + strn0cpy(ns->spawn.lastName, tmp_lastname.c_str(), sizeof(ns->spawn.lastName)); + } } } else if(GetOwnerID()) @@ -2267,7 +2271,10 @@ void NPC::PetOnSpawn(NewSpawn_Struct* ns) if(client) { SetPetOwnerClient(true); - sprintf(ns->spawn.lastName, "%s's Pet", client->GetName()); + std::string tmp_lastname = swarmOwner->GetName(); + tmp_lastname += "'s Pet"; + if (tmp_lastname.size() < sizeof(ns->spawn.lastName)) + strn0cpy(ns->spawn.lastName, tmp_lastname.c_str(), sizeof(ns->spawn.lastName)); } } }