[Comm] Падение программы под 2.6.3x

Sergey Vlasov vsu на altlinux.ru
Пн Фев 28 18:46:47 UTC 2011


On Mon, Feb 28, 2011 at 12:44:38PM +0300, Vladimir Karpinsky wrote:
> 28.02.2011 12:36, REAL пишет:
> > Дайте url на исходники.
> 
> http://plkv.gsras.ru/~karp/mtpackage.tar.gz
> 
> Дальше я пытаюсь выполнить процедуру, описанную в example2/readme.

make CFLAGS="-g -O2" немедленно указывает на место ошибки:

cc bin2sac.c -c -g -O2  
In file included from /usr/include/stdio.h:912:0,
                 from bin2sac.c:2:
In function ‘sprintf’,
    inlined from ‘main’ at bin2sac.c:20:8:
/usr/include/bits/stdio2.h:34:3: error: call to __builtin___sprintf_chk will always overflow destination buffer
In function ‘sprintf’,
    inlined from ‘main’ at bin2sac.c:21:8:
/usr/include/bits/stdio2.h:34:3: error: call to __builtin___sprintf_chk will always overflow destination buffer
make: *** [bin2sac.o] Ошибка 1


 char chd[8][24], ename[16], sname[8];
...
for(i=0;i<8;i++)  sprintf(chd[i],"-12345  -12345  -12345  ");
sprintf(ename,"-12345  -12345  ");
sprintf(sname,"-12345  ");
...
sprintf(chd[0],"%-8s%-16s",sname,ename);

При выделении места под строки забыли про завершающий '\0'.

Затычка:

--- bin2sac.c.orig	2011-02-09 04:16:23.000000000 +0300
+++ bin2sac.c	2011-02-28 21:24:11.179999993 +0300
@@ -10,7 +10,7 @@ main(ac,av)
  int i, npts, year, jday, hour, min, sec, msec, ihd[40];
  float dt, B=0.0, E, fhd[70], *tr, evla, evlo, stla, stlo, dist;
  float azi, bazi, cmpaz, cmpinc;
- char chd[8][24], ename[16], sname[8];
+ char chd[8+1][24], ename[16+1], sname[8+1];
 
 
 /* Initialize Header */


Однако это не избавляет от попадания '\0' в chd[1][0] после выполнения
sprintf(chd[0],"%-8s%-16s",sname,ename); - это лечится только
переписыванием кода, как и возможность переполнения буферов ename и
sname в случае неверных входных данных.

К сожалению, такие переполнения буферов в стеке (на 1 байт) valgrind
не ловит - срабатывает только проверка при возврате из функции,
включаемая опцией -fstack-protector (в ALT эта опция включена по
умолчанию), когда уже сложно установить, в каком именно месте функции
произошло переполнение буфера.  Однако при включении оптимизации (-O2)
начинает работать опция -D_FORTIFY_SOURCE=2 (также используется в ALT
по умолчанию); в данном случае проблема обнаруживается ещё при
компиляции, в других случаях возможен аварийный останов при
выполнении.

Добавление exit(0) просто отключает проверку при возврате из main(),
поскольку этот возврат уже не выполняется.  Лучше вместо этого
написать хотя бы return 0 (о проверке результатов write() в данном
случае, похоже, мечтать уже не приходится).

Ну и стоило бы ткнуть авторов носом в результаты сборки с
CFLAGS="-g -O2 -Wall -W" - наличие предупреждений вида warning:
'quiet' is used uninitialized in this function (даже не may be used
uninitialized, а именно is used uninitialized) не внушает уверенности
в правильности работы этого кода.
----------- следующая часть -----------
Было удалено вложение не в текстовом формате...
Имя     : отсутствует
Тип     : application/pgp-signature
Размер  : 198 байтов
Описание: Digital signature
Url     : <http://lists.altlinux.org/pipermail/community/attachments/20110228/67e02402/attachment.bin>


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