]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Add a lock to the vm_state structure and use the lock around mail_open calls
authorMark Michelson <mmichelson@digium.com>
Wed, 26 Mar 2008 19:22:16 +0000 (19:22 +0000)
committerMark Michelson <mmichelson@digium.com>
Wed, 26 Mar 2008 19:22:16 +0000 (19:22 +0000)
to prevent concurrent access of the same mailstream. This, along with trunk's
ability to configure TCP timeouts for IMAP storage will help to prevent
crashes and hangs when using voicemail with IMAP storage.

(closes issue #10487)
Reported by: ewilhelmsen

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

apps/app_voicemail.c

index 59e751c4d0b5b385bc8e921158bf977344f5f7a2..97e26f66ce5834f0dd373bc8d376c036ce3bc4ef 100644 (file)
@@ -372,6 +372,7 @@ struct vm_state {
        int starting;
        int repeats;
 #ifdef IMAP_STORAGE
+       ast_mutex_t lock;
        int updated; /* decremented on each mail check until 1 -allows delay */
        long msgArray[256];
        MAILSTREAM *mailstream;
@@ -4781,7 +4782,9 @@ static int init_mailstream(struct vm_state *vms, int box)
 #endif
                /* Connect to INBOX first to get folders delimiter */
                imap_mailbox_name(tmp, sizeof(tmp), vms, 0, 1);
+               ast_mutex_lock(&vms->lock);
                stream = mail_open (stream, tmp, debug ? OP_DEBUG : NIL);
+               ast_mutex_unlock(&vms->lock);
                if (stream == NIL) {
                        ast_log (LOG_ERROR, "Can't connect to imap server %s\n", tmp);
                        return -1;
@@ -4796,7 +4799,9 @@ static int init_mailstream(struct vm_state *vms, int box)
        imap_mailbox_name(tmp, sizeof(tmp), vms, box, 1);
        if (option_debug > 2)
                ast_log (LOG_DEBUG,"Before mail_open, server: %s, box:%d\n", tmp, box);
+       ast_mutex_lock(&vms->lock);
        vms->mailstream = mail_open (stream, tmp, debug ? OP_DEBUG : NIL);
+       ast_mutex_unlock(&vms->lock);
        if (vms->mailstream == NIL) {
                return -1;
        } else {
@@ -9026,6 +9031,7 @@ static void vmstate_delete(struct vm_state *vms)
        if (!vf) {
                ast_log(LOG_ERROR, "No vmstate found for user:%s, mailbox %s\n",vms->imapuser,vms->username);
        } else {
+               ast_mutex_destroy(&vms->lock);
                free(vf);
        }
        ast_mutex_unlock(&vmstate_lock);
@@ -9057,6 +9063,7 @@ static void init_vm_state(struct vm_state *vms)
        for (x = 0; x < 256; x++) {
                vms->msgArray[x] = 0;
        }
+       ast_mutex_init(&vms->lock);
 }
 
 static void check_msgArray(struct vm_state *vms)