Lua "bug" NaN, Inf, -Inf

  • Moin,

    aus aktuellem Anlass, wollte ich mal einen "bug" veroeffentlichen, welcher vor paar Jahren auch mal in meinem Itemshop vorhanden war.

    In vielen Pub Systemen, welche mit Lua geschrieben wurden, ist er immer noch vorhanden und wird von einigen gerne ausgenutzt.


    Wenn wir bei dem Beispiel mit dem Itemshop bleiben, dann war es dadurch moeglich, umsonst Items zu "kaufen".

    Es wird z.B. statt einer Zahl der Wert "NaN" (Not a Number) vom Client, fuer die Anzahl an Items die gekauft werden sollen, gesendet.

    In der Quest wird nun tonumber() ausgefuehrt und "NaN" bleibt "NaN".

    LUA
    1. cmd = "NaN" --(sendet "NaN" statt einer Zahl)
    2. amount = tonumber(cmd) -- enthaelt nun NaN

    Findet nun z.B. ein Vergleich statt, kommt immer false raus:

    LUA
    1. if amount > 200 then print'Die maximal Anzahl betraegt 200.' return end -- FALSE
    2. if amount < 1 then print'Die minimale Anzahl betraegt 1.' return end -- FALSE

    Das ist ja erst mal nicht ganz so schlimm.

    Wird allerdings z.B. eine Rechnung durchgefuehrt und danach ein Vergleich, ob die Coins reichen, dann haben wir ein Problem:

    LUA
    1. cmd = "NaN" --(sendet "NaN" statt einer Zahl)
    2. amount = tonumber(cmd) -- enthaelt nun NaN
    3. mycoins = 0 -- Die Anzahl an Coins aus der Coins Spalte der Account Tabelle
    4. itemPrice = 1000 -- Preis des Items im Itemshop
    5. realPrice = itemPrice*amount -- 1000 * NaN => NaN
    6. if mycoins < realPrice then print'Leider besitzt du nicht genug Coins.' return end -- FALSE (0 < NaN)
    7. -- Zwar nicht genug Coins, aber weiter gehts, da der Vergleich false ergeben hat.
    8. -- Item geben.
    9. -- Item wurde mit 0 Coins erworben.

    Hier noch ein Link dazu:

    Bitte melden Sie sich an, um diesen Link zu sehen.


    Ein Script zum Testen (z.B. auf Bitte melden Sie sich an, um diesen Link zu sehen. unter Lua):

    Wie es z.B. behoben werden kann:

    LUA
    1. function IsFinite(num)
    2. return not (num ~= num or tostring(num) == "inf" or tostring(num) == "-inf" )
    3. end
    4. -- Beispiel Aufruf
    5. amount = tonumber("123")
    6. if not IsFinite(amount) then return end -- Alles ok
    7. amount = tonumber("NaN")
    8. if not IsFinite(amount) then return end -- loest return aus

    Mfg Ente

    2 Mal editiert, zuletzt von Ente ()

  • Dieses Thema enthält 5 weitere Beiträge, die nur für registrierte Benutzer sichtbar sind, bitte registrieren Sie sich oder melden Sie sich an um diese lesen zu können.