From: Jeff Peeler Date: Wed, 15 Sep 2010 20:08:52 +0000 (+0000) Subject: Ensure mailbox is not filled to capacity before doing message forwarding. X-Git-Tag: 1.4.37-rc1~12 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=fa2b4c01964594b203c882c337af8d9455253281;p=thirdparty%2Fasterisk.git Ensure mailbox is not filled to capacity before doing message forwarding. Specifically, before prompting to record a prepended message the capacity is checked first. If the mailbox is full the extension will be reprompted. ABE-2517 git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.4@286941 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- diff --git a/apps/app_voicemail.c b/apps/app_voicemail.c index ead08664e2..ebbedb1fbf 100644 --- a/apps/app_voicemail.c +++ b/apps/app_voicemail.c @@ -5288,7 +5288,7 @@ static int forward_message(struct ast_channel *chan, char *context, struct vm_st AST_LIST_HEAD_NOLOCK_STATIC(extensions, ast_vm_user); char *stringp; const char *s; - int saved_messages = 0, found = 0; + int saved_messages = 0; int valid_extensions = 0; char *dir; int curmsg; @@ -5391,10 +5391,33 @@ static int forward_message(struct ast_channel *chan, char *context, struct vm_st while (s) { /* Don't forward to ourselves but allow leaving a message for ourselves (flag == 1). find_user is going to malloc since we have a NULL as first argument */ if ((flag == 1 || strcmp(s,sender->mailbox)) && (receiver = find_user(NULL, context, s))) { + int oldmsgs; + int newmsgs; + int capacity; + if (inboxcount(s, &newmsgs, &oldmsgs)) { + ast_log(LOG_ERROR, "Problem in calculating number of voicemail messages available for extension %s\n", s); + /* Shouldn't happen, but allow trying another extension if it does */ + res = ast_play_and_wait(chan, "pbx-invalid"); + valid_extensions = 0; + break; + } + capacity = receiver->maxmsg - inprocess_count(receiver->mailbox, receiver->context, +1); + if ((newmsgs + oldmsgs) >= capacity) { + ast_log(LOG_NOTICE, "Mailbox '%s' is full with capacity of %d, prompting for another extension.\n", s, capacity); + res = ast_play_and_wait(chan, "vm-mailboxfull"); + valid_extensions = 0; + while ((vmtmp = AST_LIST_REMOVE_HEAD(&extensions, list))) { + inprocess_count(vmtmp->mailbox, vmtmp->context, -1); + free_user(vmtmp); + } + inprocess_count(receiver->mailbox, receiver->context, -1); + break; + } AST_LIST_INSERT_HEAD(&extensions, receiver, list); - found++; } else { ast_log(LOG_NOTICE, "'%s' is not a valid mailbox\n", s); + /* "I am sorry, that's not a valid extension. Please try again." */ + res = ast_play_and_wait(chan, "pbx-invalid"); valid_extensions = 0; break; } @@ -5403,8 +5426,6 @@ static int forward_message(struct ast_channel *chan, char *context, struct vm_st /* break from the loop of reading the extensions */ if (valid_extensions) break; - /* "I am sorry, that's not a valid extension. Please try again." */ - res = ast_play_and_wait(chan, "pbx-invalid"); } /* check if we're clear to proceed */ if (AST_LIST_EMPTY(&extensions) || !valid_extensions) @@ -5467,6 +5488,7 @@ static int forward_message(struct ast_channel *chan, char *context, struct vm_st copy_msg_result = copy_message(chan, sender, 0, curmsg, duration, vmtmp, fmt, dir); #endif saved_messages++; + inprocess_count(vmtmp->mailbox, vmtmp->context, -1); AST_LIST_REMOVE_CURRENT(&extensions, list); free_user(vmtmp); if (res) @@ -5507,8 +5529,10 @@ static int forward_message(struct ast_channel *chan, char *context, struct vm_st } /* If anything failed above, we still have this list to free */ - while ((vmtmp = AST_LIST_REMOVE_HEAD(&extensions, list))) + while ((vmtmp = AST_LIST_REMOVE_HEAD(&extensions, list))) { + inprocess_count(vmtmp->mailbox, vmtmp->context, -1); free_user(vmtmp); + } return res ? res : cmd; }