From 4524c46bb2be6eb4d8fd9bf5afdf33a785002af4 Mon Sep 17 00:00:00 2001 From: Kevin Harwell Date: Fri, 30 Aug 2013 17:57:16 +0000 Subject: [PATCH] Memory leak fix ast_xmldoc_printable returns an allocated block that must be freed by the caller. Fixed manager.c and res_agi.c to stop leaking these results. (closes issue ASTERISK-22395) Reported by: Corey Farrell Patches: manager-leaks-12.patch uploaded by coreyfarrell (license 5909) res_agi-xmldoc-leaks.patch uploaded by coreyfarrell (license 5909) ........ Merged revisions 398060 from http://svn.asterisk.org/svn/asterisk/branches/1.8 ........ Merged revisions 398061 from http://svn.asterisk.org/svn/asterisk/branches/11 git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/12@398062 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- main/manager.c | 54 +++++++++++++++++++++++++------------------------- res/res_agi.c | 9 +-------- 2 files changed, 28 insertions(+), 35 deletions(-) diff --git a/main/manager.c b/main/manager.c index 38c7d8ef96..c8b0e4708e 100644 --- a/main/manager.c +++ b/main/manager.c @@ -1924,19 +1924,19 @@ static char *handle_showmancmd(struct ast_cli_entry *e, int cmd, struct ast_cli_ #ifdef AST_XML_DOCS if (cur->docsrc == AST_XML_DOC) { + char *syntax = ast_xmldoc_printable(S_OR(cur->syntax, "Not available"), 1); + char *synopsis = ast_xmldoc_printable(S_OR(cur->synopsis, "Not available"), 1); + char *description = ast_xmldoc_printable(S_OR(cur->description, "Not available"), 1); + char *arguments = ast_xmldoc_printable(S_OR(cur->arguments, "Not available"), 1); + char *seealso = ast_xmldoc_printable(S_OR(cur->seealso, "Not available"), 1); + char *privilege = ast_xmldoc_printable(S_OR(authority->str, "Not available"), 1); ast_cli(a->fd, "%s%s\n\n%s%s\n\n%s%s\n\n%s%s\n\n%s%s\n\n%s%s\n\n", - syntax_title, - ast_xmldoc_printable(S_OR(cur->syntax, "Not available"), 1), - synopsis_title, - ast_xmldoc_printable(S_OR(cur->synopsis, "Not available"), 1), - description_title, - ast_xmldoc_printable(S_OR(cur->description, "Not available"), 1), - arguments_title, - ast_xmldoc_printable(S_OR(cur->arguments, "Not available"), 1), - seealso_title, - ast_xmldoc_printable(S_OR(cur->seealso, "Not available"), 1), - privilege_title, - ast_xmldoc_printable(S_OR(authority->str, "Not available"), 1)); + syntax_title, syntax, + synopsis_title, synopsis, + description_title, description, + arguments_title, arguments, + seealso_title, seealso, + privilege_title, privilege); } else #endif { @@ -7560,29 +7560,29 @@ static char *handle_manager_show_event(struct ast_cli_entry *e, int cmd, struct ast_cli(a->fd, "Event: %s\n", a->argv[3]); for (temp = item; temp; temp = temp->next) { if (!ast_strlen_zero(ast_str_buffer(temp->synopsis))) { - ast_cli(a->fd, "%s%s\n\n", - synopsis_title, - ast_xmldoc_printable(ast_str_buffer(temp->synopsis), 1)); + char *synopsis = ast_xmldoc_printable(ast_str_buffer(temp->synopsis), 1); + ast_cli(a->fd, "%s%s\n\n", synopsis_title, synopsis); + ast_free(synopsis); } if (!ast_strlen_zero(ast_str_buffer(temp->syntax))) { - ast_cli(a->fd, "%s%s\n\n", - syntax_title, - ast_xmldoc_printable(ast_str_buffer(temp->syntax), 1)); + char *syntax = ast_xmldoc_printable(ast_str_buffer(temp->syntax), 1); + ast_cli(a->fd, "%s%s\n\n", syntax_title, syntax); + ast_free(syntax); } if (!ast_strlen_zero(ast_str_buffer(temp->description))) { - ast_cli(a->fd, "%s%s\n\n", - description_title, - ast_xmldoc_printable(ast_str_buffer(temp->description), 1)); + char *description = ast_xmldoc_printable(ast_str_buffer(temp->description), 1); + ast_cli(a->fd, "%s%s\n\n", description_title, description); + ast_free(description); } if (!ast_strlen_zero(ast_str_buffer(temp->arguments))) { - ast_cli(a->fd, "%s%s\n\n", - arguments_title, - ast_xmldoc_printable(ast_str_buffer(temp->arguments), 1)); + char *arguments = ast_xmldoc_printable(ast_str_buffer(temp->arguments), 1); + ast_cli(a->fd, "%s%s\n\n", arguments_title, arguments); + ast_free(arguments); } if (!ast_strlen_zero(ast_str_buffer(temp->seealso))) { - ast_cli(a->fd, "%s%s\n\n", - seealso_title, - ast_xmldoc_printable(ast_str_buffer(temp->seealso), 1)); + char *seealso = ast_xmldoc_printable(ast_str_buffer(temp->seealso), 1); + ast_cli(a->fd, "%s%s\n\n", seealso_title, seealso); + ast_free(seealso); } } diff --git a/res/res_agi.c b/res/res_agi.c index 74d665bd50..25251f37e0 100644 --- a/res/res_agi.c +++ b/res/res_agi.c @@ -4042,9 +4042,6 @@ static int write_htmldump(const char *filename) AST_RWLIST_RDLOCK(&agi_commands); AST_RWLIST_TRAVERSE(&agi_commands, command, list) { -#ifdef AST_XML_DOCS - char *stringptmp; -#endif char *tempstr, *stringp; if (!command->cmda[0]) /* end ? */ @@ -4057,8 +4054,7 @@ static int write_htmldump(const char *filename) fprintf(htmlfile, "\n"); fprintf(htmlfile, "\n", fullcmd, command->summary); #ifdef AST_XML_DOCS - stringptmp = ast_xmldoc_printable(command->usage, 0); - stringp = ast_strdup(stringptmp); + stringp = ast_xmldoc_printable(command->usage, 0); #else stringp = ast_strdup(command->usage); #endif @@ -4076,9 +4072,6 @@ static int write_htmldump(const char *filename) fprintf(htmlfile, "\n"); fprintf(htmlfile, "
%s - %s
\n\n"); ast_free(stringp); -#ifdef AST_XML_DOCS - ast_free(stringptmp); -#endif } AST_RWLIST_UNLOCK(&agi_commands); fprintf(htmlfile, "\n\n\n");