LinuxForum.Fans
Тема

Ошибка освобождения памяти в libxml2

Автор: Atrill 5 сообщений 1554 просмотров
#99676
text
xmlDoc * pxmldQuery = xmlReadMemory( sXmlCmd, strlen( sXmlCmd ), "noname.xml", NULL, 0 )

при передаче строки, большей чем некоторое небольшое число символов (подозреваю что 1024) выдает:

text
*** glibc detected *** ./test: free(): invalid next size (fast): 0x0804f068 ***
======= Backtrace: =========
/lib/libc.so.6[0xb7e7f105]
/lib/libc.so.6(cfree+0x96)[0xb7e810e6]
/usr/local/lib/libxml2.so.2[0xb7ffdf1d]
/usr/local/lib/libxml2.so.2[0xb80002e5]
/usr/local/lib/libxml2.so.2(xmlParseURI+0x1e)[0xb800186e]
/usr/local/lib/libxml2.so.2(xmlPathToURI+0x25)[0xb80019e5]
/usr/local/lib/libxml2.so.2(xmlSAX2StartDocument+0x11f)[0xb809e72f]
/usr/local/lib/libxml2.so.2(xmlParseDocument+0x439)[0xb7fe86f9]
/usr/local/lib/libxml2.so.2[0xb7fe888b]
./test[0x8048cc5]
./test[0x80493e7]
./test[0x80492aa]
./test[0x8049301]
./test[0x8049382]
./test[0x8049437]
/lib/libc.so.6(__libc_start_main+0xe5)[0xb7e266a5]
./test[0x8048921]
======= Memory map: ========
08048000-0804a000 r-xp 00000000 08:06 17218      /home/atrill/work/vdorders/test
0804a000-0804b000 rwxp 00001000 08:06 17218      /home/atrill/work/vdorders/test
0804b000-0806c000 rwxp 0804b000 00:00 0          [heap]
b7cf3000-b7cff000 r-xp 00000000 08:01 223        /usr/lib/libgcc_s.so.1
b7cff000-b7d00000 rwxp 0000b000 08:01 223        /usr/lib/libgcc_s.so.1
.......................
#99718
text
#include <string.h> 
#include <libxml/parser.h> 
#include <iostream> 
int main (int argc, char *argv[]) 
{ 
    LIBXML_TEST_VERSION 

std::string sXml("<foo/>"); int nLen = (int)sXml.size(); char* pszContent = new char[nLen + 2];

strncpy(pszContent, sXml.c_str(), nLen + 2); pszContent[nLen] = '\n'; pszContent[nLen + 1] = '\0';

xmlDocPtr pXmlDoc = xmlReadMemory(pszContent, nLen, "xml", "UTF-8", 0); if (pXmlDoc == NULL) return(1);

delete[] pszContent; pszContent = NULL;

xmlFreeDoc(pXmlDoc); xmlCleanupParser();

return(0); }

Надеюсь, все теперь понятно?

#99908

Да, теперь работает корректно, спасибо, хотя ошибка была не только в этом - я кормил функции только часть XML-запроса, неправильно определив его длину.
Каждый раз, когда пишу на С более или менее большой проект, чувствую себя таааким быдлокодером.
Вы не могли бы подсказать какую-либо книгу по написанию безопасного кода?

#100061

Atrill,
Если на С (не на С++), то, имхо, лучше Кернигана&Ричи никто не написал

#100235

Ок. Благодарю всех.
Думаю, тему можно закрывать.

Войдите или зарегистрируйтесь, чтобы ответить.