[devel] IA: destination buffer overflow - ppp

Dmitry V. Levin =?iso-8859-1?q?ldv_=CE=C1_altlinux=2Eorg?=
Ср Ноя 28 23:58:26 MSK 2007


On Wed, Nov 28, 2007 at 04:00:59PM +0300, Damir Shayhutdinov wrote:
> > > 2007/11/27, Dmitry V. Levin <ldv на altlinux.org>:
> > > > 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
----------- следующая часть -----------
Было удалено вложение не в текстовом формате...
Имя     : =?iso-8859-1?q?=CF=D4=D3=D5=D4=D3=D4=D7=D5=C5=D4?=
Тип     : application/pgp-signature
Размер  : 189 байтов
Описание: =?iso-8859-1?q?=CF=D4=D3=D5=D4=D3=D4=D7=D5=C5=D4?=
Url     : <http://lists.altlinux.org/pipermail/devel/attachments/20071128/99352979/attachment-0002.bin>


Подробная информация о списке рассылки Devel