]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Move 300 bytes around on the stack, to make more room for an extension buffer.
authorTilghman Lesher <tilghman@meg.abyt.es>
Mon, 11 May 2009 22:48:20 +0000 (22:48 +0000)
committerTilghman Lesher <tilghman@meg.abyt.es>
Mon, 11 May 2009 22:48:20 +0000 (22:48 +0000)
This allows more concurrent extensions to be copied for a single voicemail,
without creating a possibility of upsetting existing users, where a dialplan
could run out of stack space where it had run fine before.  Alternatively,
we could have allocated off the heap, but that is a larger change and would
have increased the chance for instability introduced by this change.

This is really solved starting in 1.6.0.11, as the use of an ast_str buffer
allows an unlimited number of extensions (up to available memory).  We
additionally create a new warning message when the buffer length is exceeded,
permitting administrators to see an issue after the fact, whereas previously
the list was silently truncated.
(closes issue #14739)
 Reported by: p_lindheimer
 Patches:
       20090417__bug14739.diff.txt uploaded by tilghman (license 14)
 Tested by: p_lindheimer

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

apps/app_voicemail.c

index 4646e9e5397d3285dc98719875374e85da149265..a1cdf386fd80b485f9c2b0d4532bd22e741f871e 100644 (file)
@@ -3965,7 +3965,7 @@ static int leave_voicemail(struct ast_channel *chan, char *ext, struct leave_vm_
        char txtfile[PATH_MAX], tmptxtfile[PATH_MAX];
        char callerid[256];
        FILE *txt;
-       char date[256];
+       char date[50];
        int txtdes;
        int res = 0;
        int msgnum;
@@ -3978,15 +3978,18 @@ static int leave_voicemail(struct ast_channel *chan, char *ext, struct leave_vm_
        char fn[PATH_MAX];
        char prefile[PATH_MAX] = "";
        char tempfile[PATH_MAX] = "";
-       char ext_context[256] = "";
+       char ext_context[AST_MAX_EXTENSION + AST_MAX_CONTEXT + 2] = "";
        char fmt[80];
        char *context;
        char ecodes[16] = "#";
-       char tmp[1024] = "", *tmpptr;
+       char tmp[1324] = "", *tmpptr;
        struct ast_vm_user *vmu;
        struct ast_vm_user svm;
        const char *category = NULL;
 
+       if (strlen(ext) > sizeof(tmp) - 1) {
+               ast_log(LOG_WARNING, "List of extensions is too long (>%ld).  Truncating.\n", (long) sizeof(tmp) - 1);
+       }
        ast_copy_string(tmp, ext, sizeof(tmp));
        ext = tmp;
        context = strchr(tmp, '@');