Merged revisions 50151 via svnmerge from
[asterisk/asterisk.git] / apps / app_voicemail.c
index a4bcd9e..6a1ce5f 100644 (file)
@@ -1848,6 +1848,22 @@ static void prep_email_sub_vars(struct ast_channel *ast, struct ast_vm_user *vmu
        pbx_builtin_setvar_helper(ast, "VM_CATEGORY", category ? ast_strdupa(category) : "no category");
 }
 
+static char *quote(const char *from, char *to, size_t len)
+{
+       char *ptr = to;
+       *ptr++ = '"';
+       for (; ptr < to + len - 1; from++) {
+               if (*from == '"')
+                       *ptr++ = '\\';
+               else if (*from == '\0')
+                       break;
+               *ptr++ = *from;
+       }
+       if (ptr < to + len - 1)
+               *ptr++ = '"';
+       *ptr = '\0';
+       return to;
+}
 /*
  * fill in *tm for current time according to the proper timezone, if any.
  * Return tm so it can be used as a function argument.
@@ -1896,6 +1912,8 @@ static void make_email_file(FILE *p, char *srcemail, struct ast_vm_user *vmu, in
        char dur[256];
        char tmpcmd[256];
        struct tm tm;
+       char *passdata2;
+       size_t len_passdata;
 
        gethostname(host, sizeof(host)-1);
        if (strchr(srcemail, '@'))
@@ -1919,7 +1937,9 @@ static void make_email_file(FILE *p, char *srcemail, struct ast_vm_user *vmu, in
                                memset(passdata, 0, vmlen);
                                prep_email_sub_vars(ast, vmu, msgnum + 1, context, mailbox, cidnum, cidname, dur, date, passdata, vmlen, category);
                                pbx_substitute_variables_helper(ast, fromstring, passdata, vmlen);
-                               fprintf(p, "From: %s <%s>\r\n",passdata,who);
+                               len_passdata = strlen(passdata) * 2 + 1;
+                               passdata2 = alloca(len_passdata);
+                               fprintf(p, "From: %s <%s>\r\n", quote(passdata, passdata2, len_passdata), who);
                        } else
                                ast_log(LOG_WARNING, "Cannot allocate workspace for variable substitution\n");
                        ast_channel_free(ast);
@@ -1927,7 +1947,9 @@ static void make_email_file(FILE *p, char *srcemail, struct ast_vm_user *vmu, in
                        ast_log(LOG_WARNING, "Cannot allocate the channel for variables substitution\n");
        } else
                fprintf(p, "From: Asterisk PBX <%s>\r\n", who);
-       fprintf(p, "To: %s <%s>\r\n", vmu->fullname, vmu->email);
+       len_passdata = strlen(vmu->fullname) * 2 + 1;
+       passdata2 = alloca(len_passdata);
+       fprintf(p, "To: %s <%s>\r\n", quote(vmu->fullname, passdata2, len_passdata), vmu->email);
        if (emailsubject) {
                struct ast_channel *ast;
                if ((ast = ast_channel_alloc(0, AST_STATE_DOWN, 0, 0, 0))) {