]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Bug fixes for voicemail user emailsubject / emailbody.
authorMatthew Jordan <mjordan@digium.com>
Fri, 26 Aug 2011 13:36:36 +0000 (13:36 +0000)
committerMatthew Jordan <mjordan@digium.com>
Fri, 26 Aug 2011 13:36:36 +0000 (13:36 +0000)
This code change fixes a few issues with the voicemail user override of
emailbody and emailsubject, including escaping the strings, potential memory
leaks, and not overriding the voicemail defaults.  Revision 325877 fixed this
for ASTERISK-16795, but did not fix it for ASTERISK-16781.  A subsequent
check-in prevented 325877 from being applied to 10.  This check-in resolves
both issues, and applies the changes to 1.8, 10, and trunk.

(closes issue ASTERISK-16781)
Reported by: Sebastien Couture
Tested by: mjordan

(closes issue ASTERISK-16795)
Reported by: mdeneen
Tested by: mjordan

Review: https://reviewboard.asterisk.org/r/1374

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

apps/app_voicemail.c

index b835d62c8c0fdad0d90b5cb29c39745e58d6f3d7..ef8a8b5980e8fb132d93a2e86e19484e9742450b 100644 (file)
@@ -1014,7 +1014,7 @@ static char *strip_control_and_high(const char *input, char *buf, size_t buflen)
  */
 static void populate_defaults(struct ast_vm_user *vmu)
 {
-       ast_copy_flags(vmu, (&globalflags), AST_FLAGS_ALL);     
+       ast_copy_flags(vmu, (&globalflags), AST_FLAGS_ALL);
        vmu->passwordlocation = passwordlocation;
        if (saydurationminfo) {
                vmu->saydurationm = saydurationminfo;
@@ -1037,7 +1037,9 @@ static void populate_defaults(struct ast_vm_user *vmu)
                vmu->maxdeletedmsg = maxdeletedmsg;
        }
        vmu->volgain = volgain;
+       ast_free(vmu->emailsubject);
        vmu->emailsubject = NULL;
+       ast_free(vmu->emailbody);
        vmu->emailbody = NULL;
 #ifdef IMAP_STORAGE
        ast_copy_string(vmu->imapfolder, imapfolder, sizeof(vmu->imapfolder));
@@ -1337,9 +1339,11 @@ static void apply_options_full(struct ast_vm_user *retval, struct ast_variable *
                } else if (!strcasecmp(var->name, "context")) {
                        ast_copy_string(retval->context, var->value, sizeof(retval->context));
                } else if (!strcasecmp(var->name, "emailsubject")) {
-                       retval->emailsubject = ast_strdup(var->value);
+                       ast_free(retval->emailsubject);
+                       retval->emailsubject = ast_strdup(substitute_escapes(var->value));
                } else if (!strcasecmp(var->name, "emailbody")) {
-                       retval->emailbody = ast_strdup(var->value);
+                       ast_free(retval->emailbody);
+                       retval->emailbody = ast_strdup(substitute_escapes(var->value));
 #ifdef IMAP_STORAGE
                } else if (!strcasecmp(var->name, "imapuser")) {
                        ast_copy_string(retval->imapuser, var->value, sizeof(retval->imapuser));
@@ -1450,7 +1454,11 @@ static struct ast_vm_user *find_user(struct ast_vm_user *ivm, const char *contex
        if (cur) {
                /* Make a copy, so that on a reload, we have no race */
                if ((vmu = (ivm ? ivm : ast_malloc(sizeof(*vmu))))) {
-                       memcpy(vmu, cur, sizeof(*vmu));
+                       vmu = cur;
+                       if (!ivm) {
+                               vmu->emailbody = ast_strdup(cur->emailbody);
+                               vmu->emailsubject = ast_strdup(cur->emailsubject);
+                       }
                        ast_set2_flag(vmu, !ivm, VM_ALLOCED);
                        AST_LIST_NEXT(vmu, list) = NULL;
                }
@@ -1729,14 +1737,13 @@ static int get_folder_by_name(const char *name)
 static void free_user(struct ast_vm_user *vmu)
 {
        if (ast_test_flag(vmu, VM_ALLOCED)) {
-               if (vmu->emailbody != NULL) {
-                       ast_free(vmu->emailbody);
-                       vmu->emailbody = NULL;
-               }
-               if (vmu->emailsubject != NULL) {
-                       ast_free(vmu->emailsubject);
-                       vmu->emailsubject = NULL;
-               }
+
+               ast_free(vmu->emailbody);
+               vmu->emailbody = NULL;
+
+               ast_free(vmu->emailsubject);
+               vmu->emailsubject = NULL;
+
                ast_free(vmu);
        }
 }
@@ -10784,7 +10791,7 @@ AST_TEST_DEFINE(test_voicemail_vmuser)
                "exitcontext=somecontext3|minsecs=10|maxsecs=100|nextaftercmd=yes|"
                "backupdeleted=50|volgain=1.3|passwordlocation=spooldir|emailbody="
                "Dear ${VM_NAME}:\n\n\tYou were just left a ${VM_DUR} long message|emailsubject="
-               "[PBX]: New message ${VM_MSGNUM} in mailbox ${VM_MAILBOX}";
+               "[PBX]: New message \\\\${VM_MSGNUM}\\\\ in mailbox ${VM_MAILBOX}";
 #ifdef IMAP_STORAGE
        static const char option_string2[] = "imapuser=imapuser|imappassword=imappasswd|"
                "imapfolder=INBOX|imapvmshareid=6000";
@@ -10822,7 +10829,7 @@ AST_TEST_DEFINE(test_voicemail_vmuser)
                ast_test_status_update(test, "Parse failure for serveremail option\n");
                res = 1;
        }
-       if (!vmu->emailsubject || strcasecmp(vmu->emailsubject, "[PBX]: New message ${VM_MSGNUM} in mailbox ${VM_MAILBOX}")) {
+       if (!vmu->emailsubject || strcasecmp(vmu->emailsubject, "[PBX]: New message \\${VM_MSGNUM}\\ in mailbox ${VM_MAILBOX}")) {
                ast_test_status_update(test, "Parse failure for emailsubject option\n");
                res = 1;
        }
@@ -11729,6 +11736,9 @@ static const char *substitute_escapes(const char *value)
                                break;
                        }
                        switch (*current) {
+                       case '\\':
+                               ast_str_append(&str, 0, "\\");
+                               break;
                        case 'r':
                                ast_str_append(&str, 0, "\r");
                                break;
@@ -12420,13 +12430,13 @@ static int load_config(int reload)
                        ast_copy_string(locale, val, sizeof(locale));
                }
                if ((val = ast_variable_retrieve(cfg, "general", "emailsubject"))) {
-                       emailsubject = ast_strdup(val);
+                       emailsubject = ast_strdup(substitute_escapes(val));
                }
                if ((val = ast_variable_retrieve(cfg, "general", "emailbody"))) {
                        emailbody = ast_strdup(substitute_escapes(val));
                }
                if ((val = ast_variable_retrieve(cfg, "general", "pagersubject"))) {
-                       pagersubject = ast_strdup(val);
+                       pagersubject = ast_strdup(substitute_escapes(val));
                }
                if ((val = ast_variable_retrieve(cfg, "general", "pagerbody"))) {
                        pagerbody = ast_strdup(substitute_escapes(val));