[asterisk-commits] rmudgett: trunk r377077 - in /trunk: ./ main/cli.c

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Mon Dec 3 13:17:27 CST 2012


Author: rmudgett
Date: Mon Dec  3 13:17:24 2012
New Revision: 377077

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=377077
Log:
Cleanup CLI resources on exit and CLI command registration errors.

(issue ASTERISK-20649)
Reported by: Corey Farrell
Patches:
      cli-leaks-1_8-10.patch (license #5909) patch uploaded by Corey Farrell
      cli-leaks-11-trunk.patch (license #5909) patch uploaded by Corey Farrell
      Modified
........

Merged revisions 377073 from http://svn.asterisk.org/svn/asterisk/branches/1.8
........

Merged revisions 377074 from http://svn.asterisk.org/svn/asterisk/branches/10
........

Merged revisions 377075 from http://svn.asterisk.org/svn/asterisk/branches/11

Modified:
    trunk/   (props changed)
    trunk/main/cli.c

Propchange: trunk/
------------------------------------------------------------------------------
Binary property 'branch-11-merged' - no diff available.

Modified: trunk/main/cli.c
URL: http://svnview.digium.com/svn/asterisk/trunk/main/cli.c?view=diff&rev=377077&r1=377076&r2=377077
==============================================================================
--- trunk/main/cli.c (original)
+++ trunk/main/cli.c Mon Dec  3 13:17:24 2012
@@ -1897,10 +1897,16 @@
 	return 0;
 }
 
+static void cli_shutdown(void)
+{
+	ast_cli_unregister_multiple(cli_cli, ARRAY_LEN(cli_cli));
+}
+
 /*! \brief initialize the _full_cmd string in * each of the builtins. */
 void ast_builtins_init(void)
 {
 	ast_cli_register_multiple(cli_cli, ARRAY_LEN(cli_cli));
+	ast_register_atexit(cli_shutdown);
 }
 
 /*!
@@ -2065,6 +2071,18 @@
 	return cmdline;
 }
 
+static int cli_is_registered(struct ast_cli_entry *e)
+{
+	struct ast_cli_entry *cur = NULL;
+
+	while ((cur = cli_next(cur))) {
+		if (cur == e) {
+			return 1;
+		}
+	}
+	return 0;
+}
+
 static int __ast_cli_unregister(struct ast_cli_entry *e, struct ast_cli_entry *ed)
 {
 	if (e->inuse) {
@@ -2096,6 +2114,15 @@
 	char **dst = (char **)e->cmda;	/* need to cast as the entry is readonly */
 	char *s;
 
+	AST_RWLIST_WRLOCK(&helpers);
+
+	if (cli_is_registered(e)) {
+		ast_log(LOG_WARNING, "Command '%s' already registered (the same ast_cli_entry)\n",
+			S_OR(e->_full_cmd, e->command));
+		ret = 0;  /* report success */
+		goto done;
+	}
+
 	memset(&a, '\0', sizeof(a));
 	e->handler(e, CLI_INIT, &a);
 	/* XXX check that usage and command are filled up */
@@ -2111,14 +2138,16 @@
 	}
 	*dst++ = NULL;
 
-	AST_RWLIST_WRLOCK(&helpers);
-
 	if (find_cli(e->cmda, 1)) {
-		ast_log(LOG_WARNING, "Command '%s' already registered (or something close enough)\n", S_OR(e->_full_cmd, e->command));
+		ast_log(LOG_WARNING, "Command '%s' already registered (or something close enough)\n",
+			S_OR(e->_full_cmd, e->command));
 		goto done;
 	}
-	if (set_full_cmd(e))
+	if (set_full_cmd(e)) {
+		ast_log(LOG_WARNING, "Error registering CLI Command '%s'\n",
+			S_OR(e->_full_cmd, e->command));
 		goto done;
+	}
 
 	lf = e->cmdlen;
 	AST_RWLIST_TRAVERSE_SAFE_BEGIN(&helpers, cur, list) {
@@ -2138,6 +2167,10 @@
 
 done:
 	AST_RWLIST_UNLOCK(&helpers);
+	if (ret) {
+		ast_free(e->command);
+		e->command = NULL;
+	}
 
 	return ret;
 }




More information about the asterisk-commits mailing list