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
1.4
Alec L Davis 14 years ago
parent c0e4bdd609
commit c875064714

@ -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);

Loading…
Cancel
Save