fix(Core/Trade): fix crash from use-after-free in trade logging (#25452)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -458,6 +458,16 @@ void WorldSession::HandleAcceptTradeOpcode(WorldPacket& /*recvPacket*/)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// log traded items before moving (pointers become invalid after moveItems)
|
||||||
|
std::string myItemsStr, hisItemsStr;
|
||||||
|
for (uint8 i = 0; i < TRADE_SLOT_TRADED_COUNT; ++i)
|
||||||
|
{
|
||||||
|
if (myItems[i])
|
||||||
|
myItemsStr += Acore::StringFormat("{} (Entry:{}) x{}, ", myItems[i]->GetTemplate()->Name1, myItems[i]->GetEntry(), myItems[i]->GetCount());
|
||||||
|
if (hisItems[i])
|
||||||
|
hisItemsStr += Acore::StringFormat("{} (Entry:{}) x{}, ", hisItems[i]->GetTemplate()->Name1, hisItems[i]->GetEntry(), hisItems[i]->GetCount());
|
||||||
|
}
|
||||||
|
|
||||||
// execute trade: 1. remove
|
// execute trade: 1. remove
|
||||||
for (uint8 i = 0; i < TRADE_SLOT_TRADED_COUNT; ++i)
|
for (uint8 i = 0; i < TRADE_SLOT_TRADED_COUNT; ++i)
|
||||||
{
|
{
|
||||||
@@ -495,23 +505,11 @@ void WorldSession::HandleAcceptTradeOpcode(WorldPacket& /*recvPacket*/)
|
|||||||
trader->ModifyMoney(my_trade->GetMoney());
|
trader->ModifyMoney(my_trade->GetMoney());
|
||||||
|
|
||||||
// log completed trade
|
// log completed trade
|
||||||
{
|
|
||||||
std::string myItemsStr, hisItemsStr = "";
|
|
||||||
|
|
||||||
for (uint8 i = 0; i < TRADE_SLOT_TRADED_COUNT; ++i)
|
|
||||||
{
|
|
||||||
if (myItems[i])
|
|
||||||
myItemsStr += Acore::StringFormat("{} (Entry:{}) x{}, ", myItems[i]->GetTemplate()->Name1, myItems[i]->GetEntry(), myItems[i]->GetCount());
|
|
||||||
if (hisItems[i])
|
|
||||||
hisItemsStr += Acore::StringFormat("{} (Entry:{}) x{}, ", hisItems[i]->GetTemplate()->Name1, hisItems[i]->GetEntry(), hisItems[i]->GetCount());
|
|
||||||
}
|
|
||||||
|
|
||||||
LOG_INFO("entities.player.trade", "Trade: Account: {} (IP: {}), Player [{}] ({}) traded with Player [{}] ({}): gave {} copper, received {} copper, gave item(s) [{}], received item(s) [{}]",
|
LOG_INFO("entities.player.trade", "Trade: Account: {} (IP: {}), Player [{}] ({}) traded with Player [{}] ({}): gave {} copper, received {} copper, gave item(s) [{}], received item(s) [{}]",
|
||||||
GetAccountId(), GetRemoteAddress(), _player->GetName(), _player->GetGUID().GetCounter(),
|
GetAccountId(), GetRemoteAddress(), _player->GetName(), _player->GetGUID().GetCounter(),
|
||||||
trader->GetName(), trader->GetGUID().GetCounter(),
|
trader->GetName(), trader->GetGUID().GetCounter(),
|
||||||
my_trade->GetMoney(), his_trade->GetMoney(),
|
my_trade->GetMoney(), his_trade->GetMoney(),
|
||||||
myItemsStr, hisItemsStr);
|
myItemsStr, hisItemsStr);
|
||||||
}
|
|
||||||
|
|
||||||
if (my_spell)
|
if (my_spell)
|
||||||
my_spell->prepare(&my_targets);
|
my_spell->prepare(&my_targets);
|
||||||
|
|||||||
Reference in New Issue
Block a user