From: Alec L Davis Date: Fri, 1 Apr 2011 06:46:56 +0000 (+0000) Subject: app_voicemail: close_mailbox needs to respect additional messages while mailbox is... X-Git-Tag: 1.4.42-rc1~34 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c8750647143f3c152ad2c87d7ab40c2e88ccfc55;p=thirdparty%2Fasterisk.git app_voicemail: close_mailbox needs to respect additional messages while mailbox is open. 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 --- diff --git a/apps/app_voicemail.c b/apps/app_voicemail.c index f8948faf6d..2976dfc6a1 100644 --- a/apps/app_voicemail.c +++ b/apps/app_voicemail.c @@ -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);