Daniel Stenberg, a hálózaton keresztüli adatküldésre és -fogadásra szolgáló curl segédprogram szerzője bejelentette az strcpy() függvény elavultságát a projekt kódbázisában, és jövőbeli használatának tilalmát. Ez a döntés a tavalyi évben a strncpy() függvény elavulttá tételére tett lépést követi, amely egy megadott számú bájtot másol egy bemeneti karakterláncból. Az strncpy() használata hibák kockázatát teremtette meg a karakterlánc végén lévő hiányzó null karakter vagy a nullákkal való további kiegészítés miatt.
Az strncpy() hívásokat az strcpy() függvénnyel helyettesítettük, amely vagy a célpuffer meghívása előtt lefoglalt memóriát a forráskarakterlánc méretének figyelembevételével, vagy ellenőrizte, hogy a forrás- és a célpuffer mérete megegyezik-e. Az strlcpy() függvényt nem cseréltük le, mivel az mindig a teljes karakterlánc másolását igényelte, vagy hibát adott vissza.
Mostantól az összes strcpy() hívást az új curlx_strcopy(dest, dsize, src, slen függvénnyel helyettesítettük. A curlx_strcopy() függvény megköveteli a forrás- és célpufferek méretét, azzal a feltétellel, hogy a célpuffernek nagyobbnak kell lennie, mint a forráspuffernek, hogy elférjen benne a karakterláncot lezáró null karakter, amelyet a puffer végéhez adunk, hogy elkerüljük a másolás során a kihagyást. Ha a célpuffer mérete nagyobb, mint nulla, de nem elég nagy a célkarakterlánc másolásához, akkor egy null bájt kerül a puffer elejére. 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; }
Az strcpy() függvény curx_strcopy() függvényre való lecserélésére azért került sor, mert fennáll az emberi hiba kockázata, ami a memória-ellenőrzések/-foglalások és az strcpy() hívások közötti kódszétváláshoz vezethet, például a kódnak csak egy részének gondatlan mozgatása vagy a kód ellenőrzése és az strcpy() hívás közé történő beszúrása miatt. Továbbá az strcpy használatának kiküszöbölése kiküszöböli a sebezhetőségi jelentésekből származó téves riasztások áradatát, amelyeket a mesterséges intelligencia általi eszközök helytelen észlelései okoznak, amelyek az strcpy() jelenlétét sebezhetőségnek tekintik anélkül, hogy figyelembe vennék a kódban már lévő ellenőrzéseket.
Forrás: opennet.ru
