My bad, true it was a use-after-free error. I was expecting
xmlUnlinkNode to totally unlink it, included removing the reference to
the document.

I have fixed it with:

    xmlSetTreeDoc (msg, NULL);

Thank you very much :)


2014-08-25 12:31 GMT+02:00 Nick Wellnhofer <wellnho...@aevum.de>:
> On 25/08/2014 11:33, Iñigo Martínez wrote:
>>
>> Hi,
>>
>> I have been looking at the memory usage of my programs using libxml2 y
>> using valgrind, and I have seen these messages:
>>
>> ==22134== Invalid read of size 8
>> ==22134==    at 0x519482F: xmlFreeNode (in
>> /usr/lib/x86_64-linux-gnu/libxml2.so.2.9.1)
>> ==22134==    by 0x400A02: main (test-command.c:51)
>> ==22134==  Address 0x7715ef8 is 152 bytes inside a block of size 176
>> free'd
>> ==22134==    at 0x4C29730: free (in
>> /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
>> ==22134==    by 0x5194391: xmlFreeDoc (in
>> /usr/lib/x86_64-linux-gnu/libxml2.so.2.9.1)
>> ==22134==    by 0x54A4BBD: xml_msg_get_msg (xml-message.c:111)
>> ==22134==    by 0x4009CA: main (test-command.c:44)
>
>
> This is not a memory leak but a use-after-free error.
>
>
>> These messages correspond to this code:
>>
>> xml-message.c 111
>>
>>      xmlNodePtr
>>      xml_msg_get_msg (const char *str) {
>>          xmlDoc *doc;
>>          xmlNodePtr msg;
>>
>>          if (!(doc = xmlRecoverDoc (BAD_CAST str)))
>>              return NULL;
>>
>>          msg = xmlDocGetRootElement (doc);
>>          xmlUnlinkNode (msg);
>>          xmlFreeDoc (doc);
>>
>>          return msg;
>>      }
>>
>> test-command.c 44 and 51
>>
>>      xmlNodePtr node;
>>      node = xml_msg_get_msg ("<Command Timestamp=\"0\"
>> ReceptionTimeStamp=\"0\" Sender=\"P1\"
>> Receiver=\"P2\"><GetData/></Command>");
>>      xmlFreeNode (node);
>>
>> Any idea on why I'm leaking memory ?
>
>
> If you unlink a node, it still keeps a pointer to the original document's
> dictionary (interned string table). So you shouldn't free the document until
> you finished processing the node. Alternatively, you could copy the node to
> another (dummy) document.
>
> Nick
>
>
> _______________________________________________
> xml mailing list, project page  http://xmlsoft.org/
> xml@gnome.org
> https://mail.gnome.org/mailman/listinfo/xml
_______________________________________________
xml mailing list, project page  http://xmlsoft.org/
xml@gnome.org
https://mail.gnome.org/mailman/listinfo/xml

Reply via email to