Daniel Stenberg, autor narzędzia curl do przesyłania i odbierania danych w sieci, ogłosił zaprzestanie używania funkcji strcpy() w kodzie projektu oraz zakaz jej dalszego stosowania. Decyzja ta jest kontynuacją ubiegłorocznego wycofania funkcji strncpy(), która kopiowała określoną liczbę bajtów z wejściowego łańcucha. Użycie strncpy() stwarzało ryzyko pojawienia się błędów z powodu pominięcia znaku null na końcu łańcucha lub nadmiernego wypełnienia zerami.
Odwołania do strncpy() zostały zastąpione funkcją strcpy(), przed wywołaniem której dokonywano alokacji pamięci dla docelowego bufora z uwzględnieniem rozmiaru łańcucha źródłowego lub istniała kontrola zgodności rozmiaru łańcucha źródłowego z buforem docelowym. Nie dokonano zamiany na funkcję strlcpy(), ponieważ zawsze było wymagane skopiowanie całego łańcucha lub zwrócenie błędu.
Teraz wszystkie wywołania strcpy() zostały zastąpione nową funkcją curlx_strcopy(dest, dsize, src, slen). Funkcja curlx_strcopy() wymaga podania rozmiaru bufora źródłowego i docelowego, zakładając, że bufor docelowy musi być większy od źródłowego, aby pomieścić znak null końca łańcucha, który jest wymuszony do dodania na końcu, aby uniknąć jego pominięcia podczas kopiowania. Jeśli rozmiar bufora docelowego jest większy od zera, ale niewystarczający do skopiowania docelowego łańcucha, do początku dodawany jest zerowy 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; }
Zamiana strcpy() na curlx_strcopy() została dokonana, ponieważ istnieje prawdopodobieństwo błędu ludzkiego, prowadzącego do rozdzielenia kodu z kontrolą/alokacją pamięci i wywołaniem strcpy(), na przykład podczas nieprzemyślanego przenoszenia tylko części kodu lub wstawiania kodu między kontrolą a wywołaniem strcpy(). Ponadto zaprzestanie używania strcpy pozwoli na wyeliminowanie negatywnego wpływu fałszywych komunikatów o podatnościach z powodu niepoprawnych wyników narzędzi AI, które uznają obecność strcpy() za podatność, nie uwzględniając wbudowanych w kod kontrolek.
Źródło: opennet.ru
