On Wed, Nov 28, 2007 at 04:00:59PM +0300, Damir Shayhutdinov wrote: > > > 2007/11/27, Dmitry V. Levin : > > > > On Tue, Nov 27, 2007 at 06:32:40PM +0300, Dmitriy Khanzhin wrote: > > > > > - strncat(ttyname, name, sizeof(ttyname)); > > > > > > + strncat(ttyname, name, sizeof(ttyname)-1); > > > > > > > Автор этого кода не справился с функцией strncat. > > > > Исправление тривиально. > > > > > > Фикс должен быть таким (см. выше)? Или нет? > > > > Да, таким. > Я честно говоря нечасто пользуюсь strncat, но разве третий параметр > означает размер буфера dest? Если верить стандарту C, он означает > максимальное количество символов из src, которое будет приклеено к > dest. Следовательно, strncat(ttyname, name, sizeof(ttyname)-1) сделает > следующее - к тому что уже имеется в ttyname, добавит еще максимум > sizeof(ttyname) - 1 байт. Явное же переполнение будет, на > strlen(ttyname) перед strncat. Конечно. Общая идея такая: - Если вы видите в коде strncat(to,from,sizeof to), то это точно ошибка, вне зависимости от остального контекста; именно её поймал компилятор. - Кроме того, если to[0] != '\0', то в коде strncat(to,from,sizeof to) снова переполнение на strlen(to); чтобы это проверить, надо видеть контекст вызова strncat. > Так что правильнее будет strncat(ttyname, name, sizeof(ttyname) - > strlen(ttyname) - 1, или просто > strlcat(ttyname, name, sizeof(ttyname)). Общее правило, наверное, такое: - если в коде можно использовать asprintf, то использовать asprintf; - если в коде можно использовать snprintf, то использовать snprintf; - если в коде можно использовать strlcat, то использовать strlcat; - иначе использовать strncat; Хотя бывают и исключения. В данном конкретном случае: код ppp не использует asprintf, но использует strlcat, поэтому наиболее подходящим для upstream'а изменением будет заменить strncat на strlcat. P.S. Не забудьте осчастливить upstream патчем. -- ldv