🐛 Bug leírás
A sell event hasItem és removeItem hívása között nincs tranzakciós védelem:
-- Ellenőrzés: van-e az inventoryban
local hasIt = exports['nxn-inventory']:hasItem(src, itemName, amount)
if not hasIt then ... return end
-- ❌ RACE CONDITION: két párhuzamos sell kérés közül mindketto
-- átmegy a hasItem ellenorzésen!
-- Item eltávolítás
local ok = exports['nxn-inventory']:removeItem(src, itemName, amount)
Forgatókönyv (dupla eladás):
- Játékos 1 db item-et tárol
- Két
sell request küldése egyszerre (pl. UI dupla kattintás, lag miatt két küldés)
- 1. kérés:
hasItem → true (1 db van) – átment
- 2. kérés:
hasItem → true (még nem távolította el az 1.) – átment
- 1. kérés:
removeItem → OK, pénz hozzáadva
- 2. kérés:
removeItem → vagy hibát dob (0 db), de a pénzt már addig megkapja ha az addMoney futása előtt az állapot nem früsszulött
Különösen veszélyes ha nxn-inventory:removeItem nem ad vissza megbízható hibakódot 0 db-nál.
📍 Érintett fájl
nxn-shop/server.lua – nxn-shop:server:sell event handler
✅ Javasolt javítás
Vezessünk be per-player zárolást a sell művelet idejére:
local sellLocks = {}
RegisterServerEvent('nxn-shop:server:sell', function(shopId, itemName, amount)
local src = source
if sellLocks[src] then
NXN.Shop.Warn(('sell: src=%d mar folyamatban van eladas, eldobva'):format(src))
return
end
sellLocks[src] = true
-- ... teljes sell logika ...
sellLocks[src] = nil
end)
🏷️ Prioritás
Maximális – egy játékos dupla pénzt szerezhet egyetlen item eladásával párhuzamos kérésekkel.
🐛 Bug leírás
A
selleventhasItemésremoveItemhívása között nincs tranzakciós védelem:Forgatókönyv (dupla eladás):
sellrequest küldése egyszerre (pl. UI dupla kattintás, lag miatt két küldés)hasItem→ true (1 db van) – átmenthasItem→ true (még nem távolította el az 1.) – átmentremoveItem→ OK, pénz hozzáadvaremoveItem→ vagy hibát dob (0 db), de a pénzt már addig megkapja ha azaddMoneyfutása előtt az állapot nem früsszulöttKülönösen veszélyes ha
nxn-inventory:removeItemnem ad vissza megbízható hibakódot 0 db-nál.📍 Érintett fájl
nxn-shop/server.lua–nxn-shop:server:sellevent handler✅ Javasolt javítás
Vezessünk be per-player zárolást a
sellművelet idejére:🏷️ Prioritás
Maximális – egy játékos dupla pénzt szerezhet egyetlen item eladásával párhuzamos kérésekkel.