Daniel Stenberg, autor nástroje pro přenos a příjem dat přes síť curl, oznámil ukončení používání funkce strcpy() v kódové základně projektu a zakázal používání této funkce do budoucna. Toto rozhodnutí je pokračováním loňského vzdání se funkce strncpy(), která kopíruje stanovený počet bajtů z incoming řetězce. Používání strncpy() vytvářelo riziko vzniku chyb kvůli vynechání nulového znaku na konci řetězce nebo nadbytečnému vyplnění nulami.
Volání na strncpy() byla nahrazena funkcí strcpy(), před jejímž voláním bylo prováděno přidělení paměti pro cílový buffer s ohledem na velikost původního řetězce nebo byla provedena kontrola shody velikosti původního řetězce a cílového bufferu. Náhrada za funkci strlcpy() nebyla provedena, protože bylo nutné vždy zkopírovat celý řetězec nebo vrátit chybu.
Nyní jsou všechna volání strcpy() nahrazena novou funkcí curlx_strcopy(dest, dsize, src, slen). Funkce curlx_strcopy() vyžaduje určení velikosti původního a cílového bufferu s kalkulací, že cílový buffer musí být vždy větší než původní, aby se vešel nulový znak na konci řetězce, který funkce povinně přidává na konec, aby se zabránilo jeho vynechání při kopírování. Pokud je velikost cílového bufferu větší než nula, ale není dostatečná pro zkopírování cílového řetězce, přidá se na začátek nulový bajt. 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; }
Náhrada strcpy() za curlx_strcopy() byla provedena, protože existuje riziko lidské chyby, která by mohla vést k rozdělení kódu s kontrolou/přidělením paměti a voláním strcpy(), například při neuváženém přesunu jen části kódu nebo vložení kódu mezi kontrolu a volání strcpy(). Kromě toho ukončení používání strcpy umožní zbavit se proudu falešných zpráv o zranitelnostech kvůli nesprávným aktivacím nástrojů AI, které považují existenci strcpy() za zranitelnost bez ohledu na kontrolu, která je v kódu k dispozici.
Zdroj: opennet.ru
