From b41873d7e9783c10547afc415d2996acd5021303 Mon Sep 17 00:00:00 2001 From: Kevin Harwell Date: Fri, 30 Aug 2013 17:53:56 +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-11.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 git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/11@398061 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- main/manager.c | 55 +++++++++++++++++++++++++++----------------------- res/res_agi.c | 9 +-------- 2 files changed, 31 insertions(+), 33 deletions(-) diff --git a/main/manager.c b/main/manager.c index ee0b997d4b..c7af520de6 100644 --- a/main/manager.c +++ b/main/manager.c @@ -1652,17 +1652,22 @@ static char *handle_showmancmd(struct ast_cli_entry *e, int cmd, struct ast_cli_ if (!strcasecmp(cur->action, a->argv[num])) { #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); ast_cli(a->fd, "%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)); + syntax_title, syntax, + synopsis_title, synopsis, + description_title, description, + arguments_title, arguments, + seealso_title, seealso); + ast_free(syntax); + ast_free(synopsis); + ast_free(description); + ast_free(arguments); + ast_free(seealso); } else #endif { @@ -7261,29 +7266,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 fe6fbc07ce..c41b202ea3 100644 --- a/res/res_agi.c +++ b/res/res_agi.c @@ -3841,9 +3841,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 ? */ @@ -3856,8 +3853,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 @@ -3875,9 +3871,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");