[asterisk-commits] rmudgett: branch 1.8 r365692 - /branches/1.8/apps/app_followme.c

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Tue May 8 15:14:34 CDT 2012


Author: rmudgett
Date: Tue May  8 15:14:30 2012
New Revision: 365692

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=365692
Log:
* Fix FollowMe memory leak on error paths in app_exec().

* Fix FollowMe leaving recorded caller name file on error paths in
app_exec().

* Use correct buffer dimension define in struct call_followme.moh[] and
struct fm_args.namerecloc[].  This fixes unexpected namerecloc filename
length restriction.

Modified:
    branches/1.8/apps/app_followme.c

Modified: branches/1.8/apps/app_followme.c
URL: http://svnview.digium.com/svn/asterisk/branches/1.8/apps/app_followme.c?view=diff&rev=365692&r1=365691&r2=365692
==============================================================================
--- branches/1.8/apps/app_followme.c (original)
+++ branches/1.8/apps/app_followme.c Tue May  8 15:14:30 2012
@@ -117,7 +117,7 @@
 struct call_followme {
 	ast_mutex_t lock;
 	char name[AST_MAX_EXTENSION];	/*!< Name - FollowMeID */
-	char moh[AST_MAX_CONTEXT];	/*!< Music On Hold Class to be used */
+	char moh[MAX_MUSICCLASS];	/*!< Music On Hold Class to be used */
 	char context[AST_MAX_CONTEXT];  /*!< Context to dial from */
 	unsigned int active;		/*!< Profile is active (1), or disabled (0). */
 	int realtime;           /*!< Cached from realtime */
@@ -153,7 +153,7 @@
 	unsigned int pending_out_connected_update:1;
 	int status;
 	char context[AST_MAX_CONTEXT];
-	char namerecloc[AST_MAX_CONTEXT];
+	char namerecloc[PATH_MAX];
 	char takecall[MAX_YN_STRING];	/*!< Digit mapping to take a call */
 	char nextindp[MAX_YN_STRING];	/*!< Digit mapping to decline a call */
 	char callfromprompt[PATH_MAX];	/*!< Sound prompt name and path */
@@ -1131,8 +1131,6 @@
 	struct number *nm, *newnm;
 	int res = 0;
 	char *argstr;
-	char namerecloc[255];
-	int duration = 0;
 	struct ast_channel *caller;
 	struct ast_channel *outbound;
 	AST_DECLARE_APP_ARGS(args,
@@ -1207,15 +1205,22 @@
 	if (ast_test_flag(&targs.followmeflags, FOLLOWMEFLAG_STATUSMSG)) 
 		ast_stream_and_wait(chan, targs.statusprompt, "");
 
-	snprintf(namerecloc,sizeof(namerecloc),"%s/followme.%s",ast_config_AST_SPOOL_DIR,chan->uniqueid);
-	duration = 5;
-
-	if (ast_test_flag(&targs.followmeflags, FOLLOWMEFLAG_RECORDNAME)) 
-		if (ast_play_and_record(chan, "vm-rec-name", namerecloc, 5, "sln", &duration, NULL, ast_dsp_get_threshold_from_settings(THRESHOLD_SILENCE), 0, NULL) < 0)
+	if (ast_test_flag(&targs.followmeflags, FOLLOWMEFLAG_RECORDNAME)) {
+		int duration = 5;
+
+		snprintf(targs.namerecloc, sizeof(targs.namerecloc), "%s/followme.%s",
+			ast_config_AST_SPOOL_DIR, chan->uniqueid);
+
+		if (ast_play_and_record(chan, "vm-rec-name", targs.namerecloc, 5, "sln", &duration,
+			NULL, ast_dsp_get_threshold_from_settings(THRESHOLD_SILENCE), 0, NULL) < 0) {
 			goto outrun;
-
-	if (!ast_fileexists(namerecloc, NULL, chan->language))
-		ast_copy_string(namerecloc, "", sizeof(namerecloc));
+		}
+
+		if (!ast_fileexists(targs.namerecloc, NULL, chan->language)) {
+			targs.namerecloc[0] = '\0';
+		}
+	}
+
 	if (!ast_test_flag(&targs.followmeflags, FOLLOWMEFLAG_DISABLEHOLDPROMPT)) {
 		if (ast_streamfile(chan, targs.plsholdprompt, chan->language))
 			goto outrun;
@@ -1226,19 +1231,11 @@
 
 	targs.status = 0;
 	targs.chan = chan;
-	ast_copy_string(targs.namerecloc, namerecloc, sizeof(targs.namerecloc));
 	ast_channel_lock(chan);
 	ast_connected_line_copy_from_caller(&targs.connected_in, &chan->caller);
 	ast_channel_unlock(chan);
 
 	findmeexec(&targs);
-
-	while ((nm = AST_LIST_REMOVE_HEAD(&targs.cnumbers, entry)))
-		ast_free(nm);
-
-	if (!ast_strlen_zero(namerecloc))
-		unlink(namerecloc);
-
 	if (targs.status != 100) {
 		ast_moh_stop(chan);
 		if (ast_test_flag(&targs.followmeflags, FOLLOWMEFLAG_UNREACHABLEMSG)) 
@@ -1287,8 +1284,15 @@
 	}
 
 outrun:
+	while ((nm = AST_LIST_REMOVE_HEAD(&targs.cnumbers, entry))) {
+		ast_free(nm);
+	}
+	if (!ast_strlen_zero(targs.namerecloc)) {
+		unlink(targs.namerecloc);
+	}
 	ast_party_connected_line_free(&targs.connected_in);
 	ast_party_connected_line_free(&targs.connected_out);
+
 	if (f->realtime) {
 		/* Not in list */
 		free_numbers(f);




More information about the asterisk-commits mailing list