Un fix pentru un posibil buffer overflow in shop.cpp: bufferul char name[36] este prea mic pentru stringul formatat, iar daca textul rezultat are exact 36 de caractere (sau mai multe), nu mai ramane loc pentru terminatorul \0, astfel sys_log poate citi mai departe din memorie si afisa caractere random sau chiar provoca un crash; solutia este marirea bufferului (de exemplu char name[512]) pentru a asigura terminarea corecta a stringului.
*Link download / Code:
Problema: In shop.cpp exista urmatorul cod:
Code:
char name[36];
snprintf(name, sizeof(name), "%-20s(#%-5d) (x %d)", item_table->szName, (int) item.vnum, item.count);
sys_log(0, "SHOP_ITEM: %-36s PRICE %-5d", name, item.price);
1) Se creeaza un char array pe stack cu dimensiunea 36. Asta inseamna maxim 35 caractere + '\0' (terminatorul de string).
2) snprintf scrie string-ul formatat in acest buffer.
3) sys_log afiseaza string-ul, citind din memorie pana la primul '\0'.
Problema apare cand string-ul formatat are EXACT 36 caractere (fara '\0').
In acest caz, conform comportamentului snprintf:
- daca lungimea este egala cu dimensiunea bufferului,
- NU se mai adauga '\0'.
Rezultatul: string-ul nu este null-terminated, iar la afisare se vor citi caractere random din memorie pana cand se gaseste accidental un '\0'.
Asta poate duce la comportament imprevizibil sau chiar crash.
Exemplu problematic:
Code:
Zen-Bohne (#70102) (x 100)
Fix: Deschidem game/src/shop.cpp si cautam:
Inlocuim cu:
Explicatie:
Marim bufferul la 512 pentru a elimina riscul de lipsa a terminatorului '\0'.
Desi folosim mai mult stack temporar, este complet sigur deoarece memoria este eliberata automat la iesirea din functie.


la acest mesaj și conținutul se va afișa automat.

