Re: [xml] memory leak: attribute values are not freed when exception is thrown in the startElement callback



Nikolay Sivov writes:

On 4/10/2014 16:20, Bart De Schuymer wrote:

Hello,

We tried using libxml2 configured with the --with-fexceptions option and have identified a memory leak when our C++ startElement callback throws an exception.
The cause of the leak is as follows:
xmlParseStartTag frees all attribute values after calling the startElement callback, but since an exception is thrown in the callback, this cleanup code isn't executed. xmlFreeParserCtxt only frees ctxt->atts: it doesn't try to free any leftover attribute values.

We tried to patch libxml2 to fix this issue but ran into errors when running make valgrind ("Memory tag error occurs"). So we decided to catch the exceptions in our callback instead which effectively prevents the memory leak from occurring.
Yes, you should handle that on your side. libxml2 is a C library, so you can't handle cpp features in it, you could try of course to maintain your own version of libxml2 extended with exception handler wrappers for all callbacks you need, but it's a strange thing to do.

The approach I take in the LibCXX library is to trap all exceptions in the callback from libxml, and handle them before returning from the callback, back to libxml.

If you want a C++ API for libxml, see http://www.libcxx.org/xml.html

Any exception you throw do have to be derived from x::exception, in order for the API to be exception-safe.


Attachment: pgpS5pI6GZFH7.pgp
Description: PGP signature



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]