]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
app_voicemail: close_mailbox needs to respect additional messages while mailbox is...
authorAlec L Davis <sivad.a@paradise.net.nz>
Fri, 1 Apr 2011 06:46:56 +0000 (06:46 +0000)
committerAlec L Davis <sivad.a@paradise.net.nz>
Fri, 1 Apr 2011 06:46:56 +0000 (06:46 +0000)
close_mailbox leave gaps in message sequence if messages are deleted and new messages
arrive during this time, this is because the shuffle down to slot 0, only shuffles
the number of pre-existing messages when mailbox is opened, ignoring new arrivals.

Fix: in close_mailbox re-evaluate number of messages before the shuffle, this then includes new arrivals.

Happens on filebased or ODBC storage.

(issues #19032,#18582,#18692,#18998)
Reported by: alecdavis,tootai,afosorio

Review: https://reviewboard.asterisk.org/r/1153/

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

apps/app_voicemail.c

index f8948faf6d0f0e893c9093358883efef0edb355e..2976dfc6a1a230ae0dc1da07d359d252a9a01712 100644 (file)
@@ -6051,6 +6051,7 @@ static int open_mailbox(struct vm_state *vms, struct ast_vm_user *vmu,int box)
 static int close_mailbox(struct vm_state *vms, struct ast_vm_user *vmu)
 {
        int x = 0;
+       int last_msg_index;
 #ifndef IMAP_STORAGE
        int res = 0, nummsg;
 #endif
@@ -6063,9 +6064,14 @@ static int close_mailbox(struct vm_state *vms, struct ast_vm_user *vmu)
        /* Get the deleted messages fixed */ 
        if (vm_lock_path(vms->curdir))
                return ERROR_LOCK_PATH;
-        
+
+       last_msg_index = last_message_index(vmu, vms->curdir);
+       if (last_msg_index !=  vms->lastmsg) {
+               ast_log(LOG_NOTICE, "%d messages arrived while mailbox was open\n", last_msg_index - vms->lastmsg);
+       }
        /* must check up to last detected message, just in case it is erroneously greater than maxmsg */
-       for (x = 0; x < vms->lastmsg + 1; x++) { 
+       for (x = 0; x < last_msg_index + 1; x++) { 
                if (!vms->deleted[x] && (strcasecmp(vms->curbox, "INBOX") || !vms->heard[x])) { 
                        /* Save this message.  It's not in INBOX or hasn't been heard */ 
                        make_file(vms->fn, sizeof(vms->fn), vms->curdir, x);