ΠŸΡ€ΠΎΠ΅ΠΊΡ‚ Curl избавился ΠΎΡ‚ использования Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ strcpy Π² ΠΊΠΎΠ΄Π΅

ДэниСл CΡ‚Π΅Π½Π±Π΅Ρ€Π³ (Daniel Stenberg), Π°Π²Ρ‚ΠΎΡ€ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ для получСния ΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠΎ сСти curl, объявил ΠΎ ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‰Π΅Π½ΠΈΠΈ использования Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ strcpy() Π² ΠΊΠΎΠ΄ΠΎΠ²ΠΎΠΉ Π±Π°Π·Π΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° ΠΈ Π·Π°ΠΏΡ€Π΅Ρ‚Π΅ примСнСния Π΄Π°Π½Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² дальнСйшСм. РСшСниС являСтся ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ΅Π½ΠΈΠ΅ΠΌ ΠΈΠ½ΠΈΡ†ΠΈΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ Π² ΠΏΡ€ΠΎΡˆΠ»ΠΎΠΌ Π³ΠΎΠ΄Ρƒ ΠΎΡ‚ΠΊΠ°Π·Π° ΠΎΡ‚ использования Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ strncpy(), ΠΊΠΎΠΏΠΈΡ€ΡƒΡŽΡ‰Π΅ΠΉ Π·Π°Π΄Π°Π½Π½ΠΎΠ΅ число Π±Π°ΠΉΡ‚ ΠΈΠ· входящСй строки. ΠŸΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ strncpy() создавало ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ возникновСния ошибок ΠΈΠ·-Π·Π° пропуска Π½ΡƒΠ»Π΅Π²ΠΎΠ³ΠΎ символа Π² ΠΊΠΎΠ½Ρ†Π΅ строки ΠΈΠ»ΠΈ Π΄ΠΎΠ±Π°Π²ΠΎΡ‡Π½ΠΎΠ³ΠΎ заполнСния нулями.

ΠžΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΡ ΠΊ strncpy() Π±Ρ‹Π»ΠΈ Π·Π°ΠΌΠ΅Π½Π΅Π½Ρ‹ Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ strcpy(), ΠΏΠ΅Ρ€Π΅Π΄ Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΠ»ΠΎΡΡŒ Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти ΠΏΠΎΠ΄ Ρ†Π΅Π»Π΅Π²ΠΎΠΉ Π±ΡƒΡ„Π΅Ρ€ c ΡƒΡ‡Ρ‘Ρ‚ΠΎΠΌ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° исходной строки ΠΈΠ»ΠΈ присутствовала ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° соотвСтствия Ρ€Π°Π·ΠΌΠ΅Ρ€Π° исходной строки ΠΈ Ρ†Π΅Π»Π΅Π²ΠΎΠ³ΠΎ Π±ΡƒΡ„Π΅Ρ€Π°. Π—Π°ΠΌΠ΅Π½Π° Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ strlcpy() Π½Π΅ Π±Ρ‹Π»Π° ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½Π°, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π»ΠΎΡΡŒ всСгда ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ всю строку Ρ†Π΅Π»ΠΈΠΊΠΎΠΌ ΠΈΠ»ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ ΠΎΡˆΠΈΠ±ΠΊΡƒ.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ всС Π²Ρ‹Π·ΠΎΠ²Ρ‹ strcpy() Π·Π°ΠΌΠ΅Π½Π΅Π½Ρ‹ Π½Π° Π½ΠΎΠ²ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ curlx_strcopy(dest, dsize, src, slen). Ѐункция curlx_strcopy() Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ указания Ρ€Π°Π·ΠΌΠ΅Ρ€Π° исходного ΠΈ Ρ†Π΅Π»Π΅Π²ΠΎΠ³ΠΎ Π±ΡƒΡ„Π΅Ρ€Π° с расчётом, Ρ‡Ρ‚ΠΎ Ρ†Π΅Π»Π΅Π²ΠΎΠΉ Π±ΡƒΡ„Π΅Ρ€ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ большС исходного для вмСщСния Π½ΡƒΠ»Π΅Π²ΠΎΠ³ΠΎ символа ΠΊΠΎΠ½Ρ†Π° строки, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ добавляСтся Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ Π² ΠΊΠΎΠ½Π΅Ρ† для ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π΅Π³ΠΎ пропуска ΠΏΡ€ΠΈ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ. Если Ρ€Π°Π·ΠΌΠ΅Ρ€ Ρ†Π΅Π»Π΅Π²ΠΎΠ³ΠΎ Π±ΡƒΡ„Π΅Ρ€Π° большС нуля, Π½ΠΎ Π΅Π³ΠΎ нСдостаточно для копирования Ρ†Π΅Π»Π΅Π²ΠΎΠΉ строки, Ρ‚ΠΎ Π² Π½Π°Ρ‡Π°Π»ΠΎ добавляСтся Π½ΡƒΠ»Π΅Π²ΠΎΠΉ Π±Π°ΠΉΡ‚. 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() Π½Π° curlx_strcopy() ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½Π°, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ сущСствуСт Π²Π΅Ρ€ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒ чСловСчСской ошибки, приводящСй ΠΊ Ρ€Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΡŽ ΠΊΠΎΠ΄Π° с ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΎΠΉ/Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ памяти ΠΈ Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ strcpy(), Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΡ€ΠΈ Π½Π΅ΠΎΠ±Π΄ΡƒΠΌΠ°Π½Π½ΠΎΠΌ пСрСносС лишь части ΠΊΠΎΠ΄Π° ΠΈΠ»ΠΈ вставки ΠΊΠΎΠ΄Π° ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΎΠΉ ΠΈ Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ strcpy(). ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‰Π΅Π½ΠΈΠ΅ использования strcpy ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ ΠΈΠ·Π±Π°Π²ΠΈΡ‚ΡŒΡΡ ΠΎΡ‚ ΠΏΠΎΡ‚ΠΎΠΊΠ° Π»ΠΎΠΆΠ½Ρ‹Ρ… сообщСний ΠΎΠ± уязвимостях ΠΈΠ·-Π·Π° Π½Π΅ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹Ρ… срабатываний AI-инструмСнтов, ΡΡ‡ΠΈΡ‚Π°ΡŽΡ‰ΠΈΡ… Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ strcpy() ΡƒΡΠ·Π²ΠΈΠΌΠΎΡΡ‚ΡŒΡŽ Π±Π΅Π· ΡƒΡ‡Ρ‘Ρ‚Π° ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΡ…ΡΡ Π² ΠΊΠΎΠ΄Π΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΎΠΊ.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: opennet.ru

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ