diff --git a/apps/app_voicemail.c b/apps/app_voicemail.c index 7e97799946..e973f717d0 100644 --- a/apps/app_voicemail.c +++ b/apps/app_voicemail.c @@ -10092,6 +10092,51 @@ static void free_vm_zones(void) AST_LIST_UNLOCK(&zones); } +static char *substitute_escapes(const char *value) +{ + char *current, *result; + + /* Add 16 for fudge factor */ + struct ast_str *str = ast_str_create(strlen(value) + 16); + + /* Substitute strings \r, \n, and \t into the appropriate characters */ + for (current = (char *) value; *current; current++) { + if (*current == '\\') { + current++; + if (!*current) { + ast_log(AST_LOG_NOTICE, "Incomplete escape at end of value.\n"); + break; + } + switch (*current) { + case 'r': + ast_str_append(&str, 0, "\r"); + break; + case 'n': +#ifdef IMAP_STORAGE + if (!str->used || str->str[str->used - 1] != '\r') { + ast_str_append(&str, 0, "\r"); + } +#endif + ast_str_append(&str, 0, "\n"); + break; + case 't': + ast_str_append(&str, 0, "\t"); + break; + default: + ast_log(AST_LOG_NOTICE, "Substitution routine does not support this character: \\%c\n", *current); + break; + } + } else { + ast_str_append(&str, 0, "%c", *current); + } + } + + result = ast_strdup(str->str); + ast_free(str); + + return result; +} + static int load_config(int reload) { struct ast_vm_user *current; @@ -10682,61 +10727,17 @@ static int load_config(int reload) adsiver = atoi(val); } } - if ((val = ast_variable_retrieve(cfg, "general", "emailsubject"))) + if ((val = ast_variable_retrieve(cfg, "general", "emailsubject"))) { emailsubject = ast_strdup(val); + } if ((val = ast_variable_retrieve(cfg, "general", "emailbody"))) { - char *tmpread, *tmpwrite; - emailbody = ast_strdup(val); - - /* substitute strings \t and \n into the appropriate characters */ - tmpread = tmpwrite = emailbody; - while ((tmpwrite = strchr(tmpread,'\\'))) { - switch (tmpwrite[1]) { - case 'r': - memmove(tmpwrite + 1, tmpwrite + 2, strlen(tmpwrite + 2) + 1); - *tmpwrite = '\r'; - break; - case 'n': - memmove(tmpwrite + 1, tmpwrite + 2, strlen(tmpwrite + 2) + 1); - *tmpwrite = '\n'; - break; - case 't': - memmove(tmpwrite + 1, tmpwrite + 2, strlen(tmpwrite + 2) + 1); - *tmpwrite = '\t'; - break; - default: - ast_log(AST_LOG_NOTICE, "Substitution routine does not support this character: %c\n", tmpwrite[1]); - } - tmpread = tmpwrite + 1; - } + emailbody = substitute_escapes(val); } - if ((val = ast_variable_retrieve(cfg, "general", "pagersubject"))) + if ((val = ast_variable_retrieve(cfg, "general", "pagersubject"))) { pagersubject = ast_strdup(val); + } if ((val = ast_variable_retrieve(cfg, "general", "pagerbody"))) { - char *tmpread, *tmpwrite; - pagerbody = ast_strdup(val); - - /* substitute strings \t and \n into the appropriate characters */ - tmpread = tmpwrite = pagerbody; - while ((tmpwrite = strchr(tmpread, '\\'))) { - switch (tmpwrite[1]) { - case 'r': - memmove(tmpwrite + 1, tmpwrite + 2, strlen(tmpwrite + 2) + 1); - *tmpwrite = '\r'; - break; - case 'n': - memmove(tmpwrite + 1, tmpwrite + 2, strlen(tmpwrite + 2) + 1); - *tmpwrite = '\n'; - break; - case 't': - memmove(tmpwrite + 1, tmpwrite + 2, strlen(tmpwrite + 2) + 1); - *tmpwrite = '\t'; - break; - default: - ast_log(AST_LOG_NOTICE, "Substitution routine does not support this character: %c\n", tmpwrite[1]); - } - tmpread = tmpwrite + 1; - } + pagerbody = substitute_escapes(val); } AST_LIST_UNLOCK(&users); ast_config_destroy(cfg);