From 717068e362866802de58fe96985bd62b98f7d5bc Mon Sep 17 00:00:00 2001 From: Matthew Jordan Date: Sun, 4 Nov 2012 00:47:17 +0000 Subject: [PATCH] Fix memory leaks in XML documentation This patch fixes two memory leaks: 1) When building XML documentation items, the 'name' attribute was extracted from XML elements but not properly freed after being copied into the item being built. 2) When unloading XML documentation, the doctree container objects were not properly freed. This patch corrects these memory leaks. Note that this patch was modified slightly for this commmit, as the case where the 'name' attribute doesn't exist also wasn't handled in the item construction. This patch also checks for that attribute not existing. (closes issue ASTERISK-20648) Reported by: Corey Farrell Tested by: mjordan patches: xmldoc-memory_leak.patch uploaded by Corey Farrell (license 5909) git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/11@375756 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- main/xmldoc.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/main/xmldoc.c b/main/xmldoc.c index 5d78102949..1633f7e1db 100644 --- a/main/xmldoc.c +++ b/main/xmldoc.c @@ -2250,6 +2250,9 @@ struct ao2_container *ast_xmldoc_build_documentation(const char *type) continue; } name = ast_xml_get_attribute(node, "name"); + if (!name) { + continue; + } switch (xmldoc_get_syntax_type(type)) { case MANAGER_EVENT_SYNTAX: @@ -2275,6 +2278,7 @@ struct ao2_container *ast_xmldoc_build_documentation(const char *type) default: item = xmldoc_build_documentation_item(node, name, type); } + ast_xml_free_attr(name); if (item) { ao2_link(docs, item); @@ -2334,12 +2338,13 @@ static int xml_pathmatch(char *xmlpattern, int xmlpattern_maxlen, glob_t *globbu /*! \brief Close and unload XML documentation. */ static void xmldoc_unload_documentation(void) { - struct documentation_tree *doctree; + struct documentation_tree *doctree; AST_RWLIST_WRLOCK(&xmldoc_tree); while ((doctree = AST_RWLIST_REMOVE_HEAD(&xmldoc_tree, entry))) { ast_free(doctree->filename); ast_xml_close(doctree->doc); + ast_free(doctree); } AST_RWLIST_UNLOCK(&xmldoc_tree);