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
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
/* 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);