mirror of
https://github.com/Kelsidavis/WoWee.git
synced 2026-04-17 17:43:52 +00:00
fix: remove reinterpret_cast UB in trade slot delegation
The TradeSlot structs differ between GameHandler (has bag/slot fields) and InventoryHandler (no bag/slot). The reinterpret_cast was undefined behavior that corrupted memory, potentially causing the teleport bug. Now properly copies fields between the two struct layouts. NOTE: 113 stale getters remain in GameHandler that read duplicate member variables never updated by domain handlers. These need systematic fixing.
This commit is contained in:
parent
f37994cc1b
commit
2633a490eb
1 changed files with 23 additions and 2 deletions
|
|
@ -5090,11 +5090,32 @@ const std::string& GameHandler::getTradePeerName() const {
|
||||||
return tradePeerName_;
|
return tradePeerName_;
|
||||||
}
|
}
|
||||||
const std::array<GameHandler::TradeSlot, GameHandler::TRADE_SLOT_COUNT>& GameHandler::getMyTradeSlots() const {
|
const std::array<GameHandler::TradeSlot, GameHandler::TRADE_SLOT_COUNT>& GameHandler::getMyTradeSlots() const {
|
||||||
if (inventoryHandler_) return reinterpret_cast<const std::array<TradeSlot, TRADE_SLOT_COUNT>&>(inventoryHandler_->getMyTradeSlots());
|
if (inventoryHandler_) {
|
||||||
|
// Convert InventoryHandler::TradeSlot → GameHandler::TradeSlot (different struct layouts)
|
||||||
|
static std::array<TradeSlot, TRADE_SLOT_COUNT> converted{};
|
||||||
|
const auto& src = inventoryHandler_->getMyTradeSlots();
|
||||||
|
for (size_t i = 0; i < TRADE_SLOT_COUNT; i++) {
|
||||||
|
converted[i].itemId = src[i].itemId;
|
||||||
|
converted[i].displayId = src[i].displayId;
|
||||||
|
converted[i].stackCount = src[i].stackCount;
|
||||||
|
converted[i].itemGuid = src[i].itemGuid;
|
||||||
|
}
|
||||||
|
return converted;
|
||||||
|
}
|
||||||
return myTradeSlots_;
|
return myTradeSlots_;
|
||||||
}
|
}
|
||||||
const std::array<GameHandler::TradeSlot, GameHandler::TRADE_SLOT_COUNT>& GameHandler::getPeerTradeSlots() const {
|
const std::array<GameHandler::TradeSlot, GameHandler::TRADE_SLOT_COUNT>& GameHandler::getPeerTradeSlots() const {
|
||||||
if (inventoryHandler_) return reinterpret_cast<const std::array<TradeSlot, TRADE_SLOT_COUNT>&>(inventoryHandler_->getPeerTradeSlots());
|
if (inventoryHandler_) {
|
||||||
|
static std::array<TradeSlot, TRADE_SLOT_COUNT> converted{};
|
||||||
|
const auto& src = inventoryHandler_->getPeerTradeSlots();
|
||||||
|
for (size_t i = 0; i < TRADE_SLOT_COUNT; i++) {
|
||||||
|
converted[i].itemId = src[i].itemId;
|
||||||
|
converted[i].displayId = src[i].displayId;
|
||||||
|
converted[i].stackCount = src[i].stackCount;
|
||||||
|
converted[i].itemGuid = src[i].itemGuid;
|
||||||
|
}
|
||||||
|
return converted;
|
||||||
|
}
|
||||||
return peerTradeSlots_;
|
return peerTradeSlots_;
|
||||||
}
|
}
|
||||||
uint64_t GameHandler::getMyTradeGold() const {
|
uint64_t GameHandler::getMyTradeGold() const {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue