From 2bf3fd09751f2b447d6383e1de4d0dab77428061 Mon Sep 17 00:00:00 2001 From: Jade Date: Wed, 6 Jan 2021 10:42:23 +0000 Subject: [PATCH] Further sanity checks for shops --- src/NPCManager.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/NPCManager.cpp b/src/NPCManager.cpp index beed3bd..f7aeec5 100644 --- a/src/NPCManager.cpp +++ b/src/NPCManager.cpp @@ -181,7 +181,7 @@ void NPCManager::npcVendorSell(CNSocket* sock, CNPacketData* data) { sItemBase* item = &plr->Inven[req->iInvenSlotNum]; ItemManager::Item* itemData = ItemManager::getItemData(item->iID, item->iType); - if (itemData == nullptr || !itemData->sellable) { // sanity + sellable check + if (itemData == nullptr || !itemData->sellable || plr->Inven[req->iInvenSlotNum].iOpt < req->iItemCnt) { // sanity + sellable check std::cout << "[WARN] Item id " << item->iID << " with type " << item->iType << " not found (sell)" << std::endl; INITSTRUCT(sP_FE2CL_REP_PC_VENDOR_ITEM_SELL_FAIL, failResp); failResp.iErrorCode = 0; @@ -318,10 +318,11 @@ void NPCManager::npcVendorBuyBattery(CNSocket* sock, CNPacketData* data) { Player* plr = PlayerManager::getPlayer(sock); int cost = req->Item.iOpt * 100; - if ((req->Item.iID == 3 ? (plr->batteryW >= 9999) : (plr->batteryN >= 9999)) || plr->money < cost) { // sanity check + if ((req->Item.iID == 3 ? (plr->batteryW >= 9999) : (plr->batteryN >= 9999)) || plr->money < cost || req->Item.iOpt < 0) { // sanity check INITSTRUCT(sP_FE2CL_REP_PC_VENDOR_BATTERY_BUY_FAIL, failResp); failResp.iErrorCode = 0; sock->sendPacket((void*)&failResp, P_FE2CL_REP_PC_VENDOR_BATTERY_BUY_FAIL, sizeof(sP_FE2CL_REP_PC_VENDOR_BATTERY_BUY_FAIL)); + return; } cost = plr->batteryW + plr->batteryN;