Daniel Stenberg, curl-i andmeedastamise tööriista autor, kuulutas vÀlja strcpy() funktsiooni kasutamise lÔpetamise projekti koodibaasis ja selle edasise kasutamise keelu. See otsus on jÀtk möödunud aasta algatatud loobumisele strncpy() funktsiooni kasutamisest, mis kopeerib mÀÀratud arvu bite sisestruktuurist. strncpy() kasutamine tekitas ohtu vigade tekkimist, kuna vÔidi vahele jÀtta null-mÀrk rida lÔpus vÔi lisada tÀiendavaid nullmÀrgid.
Viidatud strncpy() vÀljakutsed on asendatud strcpy() funktsiooniga, mille kutsumise eel on mÀlu eraldatud sihtbufferile, arvestades lÀhte stringi suurust, vÔi on kontrollitud lÀhte stringi ja sihtbufferi suuruse vastavust. Asendust strlcpy() funktsiooniga ei toimu, kuna on alati vajalik kogu stringi tÀielik kopeerimine vÔi vea tagastamine.
NĂŒĂŒd on kĂ”ik strcpy() kutsed asendatud uue funktsiooniga curlx_strcopy(dest, dsize, src, slen). Funktsioon curlx_strcopy() nĂ”uab lĂ€hteteabe ja sihtbuffri suuruste mÀÀramist, arvestades, et sihtbuffer peab olema lĂ€htest suurem, et mahutada null-tĂ€hemĂ€rk, mis lisatakse funktsiooni poolt lĂ”ppu, et vĂ€ltida selle tĂ€helepanuta jĂ€tmist kopeerimise ajal. Kui sihtbuffri suurus on suurem kui null, kuid selle jaoks ei piisa sihtmĂ€rgi kopeerimiseks, lisatakse null-bait algusesse.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; }
strcpy() asendamine curlx_strcopy()'ga on tehtud, kuna on olemas vĂ”imalus inimliku vea tĂ”ttu, mis vĂ”ib viia koodi jagamiseni kontrollimise/mĂ€lu eraldamise ja strcpy() kutse vahel, nĂ€iteks kui liigitatakse ĂŒmber vaid osa koodist vĂ”i koodi sisestamisel kontrollimise ja strcpy() kutse vahele. Lisaks lĂ”petamine kasutamine strcpy aitab vabaneda vale positiivsete haavatavuste teadetest, sest AI-otsingutööriistad peavad strcpy() kohalolekut haavatavuseks, lĂ€htumata koodis olevatest kontrollidest.
Allikas: opennet.ru
