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:
parent
864d8cebfa
commit
f1a2b8304e
1 changed files with 15 additions and 17 deletions
|
|
@ -458,6 +458,16 @@ void WorldSession::HandleAcceptTradeOpcode(WorldPacket& /*recvPacket*/)
|
|||
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
|
||||
for (uint8 i = 0; i < TRADE_SLOT_TRADED_COUNT; ++i)
|
||||
{
|
||||
|
|
@ -495,23 +505,11 @@ void WorldSession::HandleAcceptTradeOpcode(WorldPacket& /*recvPacket*/)
|
|||
trader->ModifyMoney(my_trade->GetMoney());
|
||||
|
||||
// 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) [{}]",
|
||||
GetAccountId(), GetRemoteAddress(), _player->GetName(), _player->GetGUID().GetCounter(),
|
||||
trader->GetName(), trader->GetGUID().GetCounter(),
|
||||
my_trade->GetMoney(), his_trade->GetMoney(),
|
||||
myItemsStr, hisItemsStr);
|
||||
}
|
||||
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(),
|
||||
trader->GetName(), trader->GetGUID().GetCounter(),
|
||||
my_trade->GetMoney(), his_trade->GetMoney(),
|
||||
myItemsStr, hisItemsStr);
|
||||
|
||||
if (my_spell)
|
||||
my_spell->prepare(&my_targets);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue