]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
* Fix FollowMe memory leak on error paths in app_exec().
authorRichard Mudgett <rmudgett@digium.com>
Tue, 8 May 2012 20:14:30 +0000 (20:14 +0000)
committerRichard Mudgett <rmudgett@digium.com>
Tue, 8 May 2012 20:14:30 +0000 (20:14 +0000)
* 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.

git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.8@365692 65c4cc65-6c06-0410-ace0-fbb531ad65f3

apps/app_followme.c

index c2c194ec6d6ea4083d8867ab7870e32a2f44ebd7..85363e903da81f39bc023ed9ce393e7b48b16369 100644 (file)
@@ -117,7 +117,7 @@ struct number {
 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 @@ struct fm_args {
        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 @@ static int app_exec(struct ast_channel *chan, const char *data)
        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 @@ static int app_exec(struct ast_channel *chan, const char *data)
        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)) {
+               int 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)
+               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(targs.namerecloc, NULL, chan->language)) {
+                       targs.namerecloc[0] = '\0';
+               }
+       }
 
-       if (!ast_fileexists(namerecloc, NULL, chan->language))
-               ast_copy_string(namerecloc, "", sizeof(namerecloc));
        if (!ast_test_flag(&targs.followmeflags, FOLLOWMEFLAG_DISABLEHOLDPROMPT)) {
                if (ast_streamfile(chan, targs.plsholdprompt, chan->language))
                        goto outrun;
@@ -1226,19 +1231,11 @@ static int app_exec(struct ast_channel *chan, const char *data)
 
        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 @@ static int app_exec(struct ast_channel *chan, const char *data)
        }
 
 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);