[devel] IA: destination buffer overflow

Dmitry V. Levin =?iso-8859-1?q?ldv_=CE=C1_altlinux=2Eorg?=
Вт Ноя 27 17:10:36 MSK 2007


On Tue, Nov 27, 2007 at 01:11:10PM +0300, Damir Shayhutdinov wrote:
[...]
> Я вчера наблюдал пример ложного срабатывания, которое пришлось
> залечить вот таким вот патчем:
> 
> http://git.altlinux.org/people/damir/packages/?p=freedroidrpg.git;a=blob;f=freedroidrpg-0.10.3-alt-fix-buffer-overflow.patch;h=3cf47e900b1368bdbfde78c5722c8dc2c9b7b123;hb=778a38a4dd43d61abd87e07946937c9de6a8a8a9
> 
> Ложное срабатывание было в freedroidrpg/src/network.c:654
> 
> Формулировка компилятора была однозначна - always overflow. На самом
> деле, до тех пор пока 0 <= PlayerNum < MAX_PLAYERS (а это именно так
> при всех вызовах этой функции), никакого overflow не будет.
> 
> Пришлось добавлять лишний guard, чтобы умилостивить компилятор.

Этот кусок кода можно упростить до

extern struct { char a; } from[1], to[1];
void copy(int n)
{
	if (n != 0)
		memcpy(&to[1], &from[0], sizeof(to[1]));
}

Компилятор однозначно говорит: will always overflow destination buffer
Он прав, если случится n != 0, то будет выполнен код, который всегда
приводит к overflow.  Если n всегда 0, то этот вредоносный код не
выполнится никогда, и его можно убрать вместе с проверкой n != 0.

В вашем случае предупреждение компилятора пропадёт, как только MAX_PLAYERS
станет больше 1.

Добавенная вами проверка -- это не лишний guard, благодаря ней
компилятор выкинул весь цикл.


-- 
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/20071127/ded1716e/attachment-0002.bin>


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