From 51356610b29bd162b178bde8d900d386440140fd Mon Sep 17 00:00:00 2001 From: Akkadius Date: Fri, 21 Aug 2020 00:23:13 -0500 Subject: [PATCH] Fix overflow issue with character corpse creation using the wrong struct in allocation --- zone/corpse.cpp | 8 ++++---- zone/loottables.cpp | 27 +++++++++++++++++++++------ 2 files changed, 25 insertions(+), 10 deletions(-) diff --git a/zone/corpse.cpp b/zone/corpse.cpp index cfcfb0397..e0e1d1992 100644 --- a/zone/corpse.cpp +++ b/zone/corpse.cpp @@ -621,7 +621,7 @@ bool Corpse::Save() { end = itemlist.end(); for (; cur != end; ++cur) { ServerLootItem_Struct* item = *cur; - memcpy((char*)&dbpc->items[x++], (char*)item, sizeof(ServerLootItem_Struct)); + memcpy((char*)&dbpc->items[x++], (char*)item, sizeof(player_lootitem::ServerLootItem_Struct)); } /* Create New Corpse*/ @@ -1573,10 +1573,10 @@ void Corpse::UpdateEquipmentLight() for (auto iter = itemlist.begin(); iter != itemlist.end(); ++iter) { if ((*iter)->equip_slot < EQ::invslot::EQUIPMENT_BEGIN || (*iter)->equip_slot > EQ::invslot::EQUIPMENT_END) { continue; } if ((*iter)->equip_slot == EQ::invslot::slotAmmo) { continue; } - + auto item = database.GetItem((*iter)->item_id); if (item == nullptr) { continue; } - + if (EQ::lightsource::IsLevelGreater(item->Light, m_Light.Type[EQ::lightsource::LightEquipment])) m_Light.Type[EQ::lightsource::LightEquipment] = item->Light; } @@ -1584,7 +1584,7 @@ void Corpse::UpdateEquipmentLight() uint8 general_light_type = 0; for (auto iter = itemlist.begin(); iter != itemlist.end(); ++iter) { if ((*iter)->equip_slot < EQ::invslot::GENERAL_BEGIN || (*iter)->equip_slot > EQ::invslot::GENERAL_END) { continue; } - + auto item = database.GetItem((*iter)->item_id); if (item == nullptr) { continue; } diff --git a/zone/loottables.cpp b/zone/loottables.cpp index b7c343810..b4e0f00f0 100644 --- a/zone/loottables.cpp +++ b/zone/loottables.cpp @@ -523,22 +523,37 @@ void NPC::AddLootDrop( } } -void NPC::AddItem(const EQ::ItemData* item, uint16 charges, bool equipitem) { +void NPC::AddItem(const EQ::ItemData *item, uint16 charges, bool equipitem) +{ //slot isnt needed, its determined from the item. auto loot_drop_entry = NPC::NewLootDropEntry(); - loot_drop_entry.equip_item = static_cast(equipitem ? 1 : 0); + loot_drop_entry.equip_item = static_cast(equipitem ? 1 : 0); + loot_drop_entry.item_charges = charges; AddLootDrop(item, &itemlist, loot_drop_entry, true); } -void NPC::AddItem(uint32 itemid, uint16 charges, bool equipitem, uint32 aug1, uint32 aug2, uint32 aug3, uint32 aug4, uint32 aug5, uint32 aug6) { +void NPC::AddItem( + uint32 itemid, + uint16 charges, + bool equipitem, + uint32 aug1, + uint32 aug2, + uint32 aug3, + uint32 aug4, + uint32 aug5, + uint32 aug6 +) +{ //slot isnt needed, its determined from the item. - const EQ::ItemData * i = database.GetItem(itemid); - if(i == nullptr) + const EQ::ItemData *i = database.GetItem(itemid); + if (i == nullptr) { return; + } auto loot_drop_entry = NPC::NewLootDropEntry(); - loot_drop_entry.equip_item = static_cast(equipitem ? 1 : 0); + loot_drop_entry.equip_item = static_cast(equipitem ? 1 : 0); + loot_drop_entry.item_charges = charges; AddLootDrop(i, &itemlist, loot_drop_entry, true, aug1, aug2, aug3, aug4, aug5, aug6); }