Skip to content

[nxn-shop] sell event: hasItem és removeItem között nincs zárolás – dupla eladás lehetséges #178

Description

@firstvideosgrp

🐛 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):

  1. Játékos 1 db item-et tárol
  2. Két sell request küldése egyszerre (pl. UI dupla kattintás, lag miatt két küldés)
  3. 1. kérés: hasItem → true (1 db van) – átment
  4. 2. kérés: hasItem → true (még nem távolította el az 1.) – átment
  5. 1. kérés: removeItem → OK, pénz hozzáadva
  6. 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.luanxn-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.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingnxn-shop

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions