From 4c9a3b7c29cdaa961c3fa59a428344b2043c607d Mon Sep 17 00:00:00 2001 From: Uleat Date: Mon, 27 Jul 2015 22:13:55 -0400 Subject: [PATCH] Fix for crash potential in Client::Handle_OP_ShopPlayerBuy --- changelog.txt | 3 +++ zone/client_packet.cpp | 25 +++++++++++++++++-------- 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/changelog.txt b/changelog.txt index c403db8dd..18b2e9a3f 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,5 +1,8 @@ EQEMu Changelog (Started on Sept 24, 2003 15:50) ------------------------------------------------------- +== 07/27/2015 == +Uleat: Reworked the QS Audit code in Handle_OP_ShopPlayerBuy (\zone\client_packet.cpp) to help eliminate potential for exception errors + == 07/22/2015 == mackal: Corrected some hate value calcs based on updated http://www.eqemulator.org/forums/showthread.php?t=39819 diff --git a/zone/client_packet.cpp b/zone/client_packet.cpp index ce63610da..f1ec8e8ec 100644 --- a/zone/client_packet.cpp +++ b/zone/client_packet.cpp @@ -12232,20 +12232,29 @@ void Client::Handle_OP_ShopPlayerBuy(const EQApplicationPacket *app) qsaudit->items[0].item_id = item->ID; qsaudit->items[0].charges = mpo->quantity; - if (freeslotid == INVALID_INDEX) { + const ItemInst* audit_inst = m_inv[freeslotid]; + + if (audit_inst) { + qsaudit->items[0].aug_1 = audit_inst->GetAugmentItemID(0); + qsaudit->items[0].aug_2 = audit_inst->GetAugmentItemID(1); + qsaudit->items[0].aug_3 = audit_inst->GetAugmentItemID(2); + qsaudit->items[0].aug_4 = audit_inst->GetAugmentItemID(3); + qsaudit->items[0].aug_5 = audit_inst->GetAugmentItemID(4); + } + else { qsaudit->items[0].aug_1 = 0; qsaudit->items[0].aug_2 = 0; qsaudit->items[0].aug_3 = 0; qsaudit->items[0].aug_4 = 0; qsaudit->items[0].aug_5 = 0; + + if (freeslotid != INVALID_INDEX) { + Log.Out(Logs::General, Logs::Error, "Handle_OP_ShopPlayerBuy: QS Audit could not locate merchant (%u) purchased item in player (%u) inventory slot (%i)", + qsaudit->merchant_id, qsaudit->char_id, freeslotid); + } } - else { - qsaudit->items[0].aug_1 = m_inv[freeslotid]->GetAugmentItemID(0); - qsaudit->items[0].aug_2 = m_inv[freeslotid]->GetAugmentItemID(1); - qsaudit->items[0].aug_3 = m_inv[freeslotid]->GetAugmentItemID(2); - qsaudit->items[0].aug_4 = m_inv[freeslotid]->GetAugmentItemID(3); - qsaudit->items[0].aug_5 = m_inv[freeslotid]->GetAugmentItemID(4); - } + + audit_inst = nullptr; qspack->Deflate(); if (worldserver.Connected()) { worldserver.SendPacket(qspack); }