Daniel Stenberg, autor nástroja na priame získavanie a odosielanie dát cez sieť curl, oznámil ukončenie používania funkcie strcpy() v kódovej báze projektu a zákaz jej ďalšieho použitia. Toto rozhodnutie nadväzuje na minuloročné rozhodnutie vzdať sa funkcie strncpy(), ktorá kopíruje zadaný počet bajtov z vstupného reťazca. Používanie strncpy() vytváralo riziko vzniku chýb v dôsledku vynechania nulového symbolu na konci reťazca alebo dodatočného zaplnenia nulami.
Volania na strncpy() boli nahradené funkciou strcpy(), pred volaním ktorej sa vykonalo pridelenie pamäte pre cieľový buffer s ohľadom na veľkosť pôvodného reťazca alebo bola prítomná kontrola zhodnosti veľkosti pôvodného reťazca a cieľového bufferu. Nahradenie na funkciu strlcpy() nebolo vykonané, pretože vždy bolo potrebné kopírovať celý reťazec alebo vrátiť chybu.
Teraz sú všetky volania strcpy() nahradené novou funkciou curlx_strcopy(dest, dsize, src, slen). Funkcia curlx_strcopy() vyžaduje zadanie veľkosti pôvodného a cieľového bufferu s tým, že cieľový buffer musí byť nevyhnutne väčší ako pôvodný, aby sa zmestil nulový symbol na konci reťazca, ktorý funkcia pridaním zabránila vynechaniu pri kopírovaní. Ak je veľkosť cieľového bufferu väčšia ako nula, ale nie je dostatočná na skopírovanie cieľového reťazca, nulový bajt sa pridá na začiatok. void curlx_strcopy(char *dest, size_t dsize, const char *src, size_t slen) { DEBUGASSERT(slen < dsize); if(slen < dsize) { memcpy(dest, src, slen); dest[slen] = 0; } else if(dsize) dest[0] = 0; }
Nahradenie strcpy() funkciou curlx_strcopy() bolo vykonané, pretože existuje pravdepodobnosť ľudskej chyby, ktorá vedie k oddeleniu kódu s kontrolou/použitím pamäte a volaním strcpy(), napríklad pri premyslenom prenose iba časti kódu alebo vložení kódu medzi kontrolu a volanie strcpy(). Okrem toho zastavenie používania strcpy umožní zbaviť sa prúdu falošných správ o zraniteľnostiach spôsobených nesprávnymi aktiváciami AI nástrojov, ktoré považujú prítomnosť strcpy() za zraniteľnosť bez zohľadnenia existujúcich kontrol v kóde.
Zdroj: opennet.ru
