parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

9 лет висело ружье на стене (судя по CVS с 1.72 от 16-Oct-01)

moko 01.06.2010 17:37

Проблема есть, есть и решение. Интересно, что вылезло это только на конкретной конфигурации - получается во всех остальных системных библиотеках используется реализация memcpy, которой не принциально пересечение областей. Но потенциально может вылезти где угодно и когда угодно. :( На остальные memcpy в коде тоже посмотрим.

man memcpy:
The memcpy() function copies n bytes from memory area src to memory area dest. The memory areas should not overlap. Use memmove(3) if the memory areas do overlap.
>cvs diff -u pa_common.C
Index: pa_common.C
===================================================================
RCS file: /parser3project/parser3/src/main/pa_common.C,v
retrieving revision 1.259
diff -u -r1.259 pa_common.C
--- pa_common.C 25 May 2010 09:30:30 -0000 1.259
+++ pa_common.C 1 Jun 2010 13:18:16 -0000
@@ -102,7 +102,7 @@
while(char* eol=(char*)memchr(bol, '\r', eob -bol)) {
size_t len=eol-bol;
if(dest!=bol)
- memcpy(dest, bol, len);
+ memmove(dest, bol, len);
dest+=len;
*dest++='\n';

@@ -114,7 +114,7 @@
}
// last piece without \r
if(dest!=bol)
- memcpy(dest, bol, eob-bol);
+ memmove(dest, bol, eob-bol);
str[length]=0; // terminating
}

P.S. Вызов fix_line_breaks идет из VForm::AppendFormEntry.