From a11e8b1b9a7661a19a75ef4ffbff99e7adb1ec8d Mon Sep 17 00:00:00 2001 From: Martin Szulecki Date: Fri, 23 Jan 2015 15:05:38 +0100 Subject: xplist: Plug memory leak by cleaning up libxml2's parser after use This is actually considered bad practice. However, it appears this memory leak is otherwise not possible to fix due to a design flaw in how libxml2 handles the lifecycle of it's XML parser. We'll let the community test this in production now and decide. In our tests this change had no drawbacks except fixing the last known memory leak in libplist. --- src/xplist.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/xplist.c b/src/xplist.c index e368b8b..1ee0138 100644 --- a/src/xplist.c +++ b/src/xplist.c @@ -556,6 +556,14 @@ PLIST_API void plist_to_xml(plist_t plist, char **plist_xml, uint32_t * length) setlocale(LC_NUMERIC, saved_locale); free(saved_locale); } + + /* free memory from parser initialization */ + xmlCleanupCharEncodingHandlers(); + xmlDictCleanup(); + xmlResetLastError(); + xmlCleanupGlobals(); + xmlCleanupThreads(); + xmlCleanupMemory(); } static xmlParserInputPtr plist_xml_external_entity_loader(const char *URL, const char *ID, xmlParserCtxtPtr ctxt) @@ -576,4 +584,12 @@ PLIST_API void plist_from_xml(const char *plist_xml, uint32_t length, plist_t * xml_to_node(root_node, plist); xmlFreeDoc(plist_doc); } + + /* free memory from parser initialization */ + xmlCleanupCharEncodingHandlers(); + xmlDictCleanup(); + xmlResetLastError(); + xmlCleanupGlobals(); + xmlCleanupThreads(); + xmlCleanupMemory(); } -- cgit v1.1-32-gdbae