aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--apps/app_voicemail.c26
1 files changed, 24 insertions, 2 deletions
diff --git a/apps/app_voicemail.c b/apps/app_voicemail.c
index a4bcd9ea8..6a1ce5f5d 100644
--- a/apps/app_voicemail.c
+++ b/apps/app_voicemail.c
@@ -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))) {