[devel] firebird x86 error will always overflow destination buffer HELP!

Anatoly Lyutin vostok на altlinux.org
Чт Апр 4 17:24:41 MSK 2013


04.04.2013 17:07, Dmitry V. Levin пишет:
> On Thu, Apr 04, 2013 at 03:07:28PM +0400, Aleksey Novodvorsky wrote:
>> Так как бага только на i586, то, возможно, стоит уменьшить или снять оптимизацию
>> Rgrds, Алексей
> Очень мило.  Отключение _FORTIFY_SOURCE - это не отключение ошибки, а
> всего лишь отключение проверки ошибки.  Ошибка при этом никуда не денется.
> Фраза "will always overflow destination buffer" означает, что, по мнению
> gcc, если исполнение кода дойдет до указанной точки, то destination buffer
> overflow произойдет наверняка.

Насколько я понял из представленного кода, то переполнение будет только 
тогда, когда q1 на некой итерации цикла будет равно sizeof(line) и если 
мы провалимся по всем условиям вниз, то будет на strncpy такая ситуация 
для q1:

q1 = 256 + 4 - 4 = 256

  и когда мы будем туда вклинивать ещё три байта, то это, безусловно, 
переполнение. Но, во-первых, это будет не  always, а во-вторых, не 
понятно почему хаки типа 
http://pastie.org/private/p8cenbtjbwnjnagcn4rciq не гасят сообщение о 
переполнении.

Я не знаю как устроен чекер этого code case. Может быть кто-то прольёт 
свет и проведёт ликбез?


>
>> 4 апреля 2013 г., 15:01 пользователь Boris Savelev
>> <boris.savelev at gmail.com> написал:
>>> поторопился я. ошибка всё равно. только теперь на memcpy (
>>>
>>> 4 апреля 2013 г., 14:04 пользователь Boris Savelev
>>> <boris.savelev at gmail.com> написал:
>>>> компилируется... спасибо)
>>>>
>>>> 4 апреля 2013 г., 11:42 пользователь Damir Shayhutdinov
>>>> <damir at altlinux.org> написал:
>>>>> В коде похоже есть ошибка.
>>>>>
>>>>> Можно вот так подправить:
>>>>>
>>>>> 1115                                                         if (p1 < q &&
>>>>> ((d = *p1++) == '_' || d == '$'))
>>>>> 1116
>>>>> strncpy(q1 - 4, "isc", 3);
>>>>> 1117                                                         else
>>>>> 1118                                                                 *q1++ =
>>>>> d;
>>>>>
>>>>> заменить на
>>>>>
>>>>> if (p1 < q)
>>>>> {
>>>>>        if ((d = *p1++) == '_' || d == '$')
>>>>>             memcpy(q1 - 4, "isc", 3);
>>>>>        else
>>>>>             *q1++ = d;
>>>>> }
>>>>>
>>>>> Правда я не уверен, что при этом проблема не исчезнет. Если не исчезнет,
>>>>> можно еще в строчке 1073 увеличить размер line с 256 до 260.
>>>>>
>>>>>
>>>>> 2013/4/4 Boris Savelev <boris at altlinux.org>
>>>>>> Привет!
>>>>>> Помогите мне, пожалуйста, собрать firebird.
>>>>>> Ошибка:
>>>>>> In function 'char* strncpy(char*, const char*, size_t)',
>>>>>>      inlined from 'void gen_blr(void*, SSHORT, const char*)' at
>>>>>> ../src/gpre/c_cxx.cpp:1116:34:
>>>>>> /usr/include/bits/string3.h:120:71: error: call to char*
>>>>>> __builtin___strncpy_chk(char*, const char*, unsigned int, unsigned
>>>>>> int) will always overflow destination buffer
>>>>>>
>>>>>> Лог:
>>>>>> http://git.altlinux.org/tasks/93764/build/100/i586/log
>>>>>>
>>>>>> Код:
>>>>>>
>>>>>> http://git.altlinux.org/people/boris/packages/?p=firebird.git;a=blob;f=Firebird/src/gpre/c_cxx.cpp;h=806bcac4ed69b8d0963c69c16f6b2c9fbd6b7852;hb=HEAD#l1116
>
>
> _______________________________________________
> Devel mailing list
> Devel at lists.altlinux.org
> https://lists.altlinux.org/mailman/listinfo/devel

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.altlinux.org/pipermail/devel/attachments/20130404/0c45dcea/attachment.html>


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