From 961dd9fe52f9c53a314dcf2cdfb7840d473da672 Mon Sep 17 00:00:00 2001
From: Sungtae Kim <pchero21@gmail.com>
Date: Tue, 6 Mar 2018 15:14:54 +0100
Subject: [PATCH] voicemail: Fixed wrong voicemail message count

Fixed wrong voicemail mailbox reference for Action: VoicemailUsersList.

ASTERISK-27703

Change-Id: Ie6578ad80bba2bfaf34b84f0be978f59045ce6cd
---
 apps/app_voicemail.c | 74 ++++++++++++++++++++++++++++++++++----------
 1 file changed, 57 insertions(+), 17 deletions(-)

diff --git a/apps/app_voicemail.c b/apps/app_voicemail.c
index 72e3e59c12..1e7d09128e 100644
--- a/apps/app_voicemail.c
+++ b/apps/app_voicemail.c
@@ -6089,22 +6089,33 @@ static int has_voicemail(const char *mailbox, const char *folder)
 	return 0;
 }
 
-
+/*!
+ * \brief Check the given mailbox's message count.
+ * \param mailbox The @ delimited string for user@context. If no context is found, uses 'default' for the context.
+ * \param urgentmsgs  urgent message count.
+ * \param newmsgs new message count.
+ * \param oldmsgs old message count pointer
+ * \return -1 if error occurred, 0 otherwise.
+ */
 static int inboxcount2(const char *mailbox, int *urgentmsgs, int *newmsgs, int *oldmsgs)
 {
 	char tmp[256];
 	char *context;
 
 	/* If no mailbox, return immediately */
-	if (ast_strlen_zero(mailbox))
+	if (ast_strlen_zero(mailbox)) {
 		return 0;
+	}
 
-	if (newmsgs)
+	if (newmsgs) {
 		*newmsgs = 0;
-	if (oldmsgs)
+	}
+	if (oldmsgs) {
 		*oldmsgs = 0;
-	if (urgentmsgs)
+	}
+	if (urgentmsgs) {
 		*urgentmsgs = 0;
+	}
 
 	if (strchr(mailbox, ',')) {
 		int tmpnew, tmpold, tmpurgent;
@@ -6114,15 +6125,18 @@ static int inboxcount2(const char *mailbox, int *urgentmsgs, int *newmsgs, int *
 		mb = tmp;
 		while ((cur = strsep(&mb, ", "))) {
 			if (!ast_strlen_zero(cur)) {
-				if (inboxcount2(cur, urgentmsgs ? &tmpurgent : NULL, newmsgs ? &tmpnew : NULL, oldmsgs ? &tmpold : NULL))
+				if (inboxcount2(cur, urgentmsgs ? &tmpurgent : NULL, newmsgs ? &tmpnew : NULL, oldmsgs ? &tmpold : NULL)) {
 					return -1;
-				else {
-					if (newmsgs)
+				} else {
+					if (newmsgs) {
 						*newmsgs += tmpnew;
-					if (oldmsgs)
+					}
+					if (oldmsgs) {
 						*oldmsgs += tmpold;
-					if (urgentmsgs)
+					}
+					if (urgentmsgs) {
 						*urgentmsgs += tmpurgent;
+					}
 				}
 			}
 		}
@@ -6131,17 +6145,21 @@ static int inboxcount2(const char *mailbox, int *urgentmsgs, int *newmsgs, int *
 
 	ast_copy_string(tmp, mailbox, sizeof(tmp));
 
-	if ((context = strchr(tmp, '@')))
+	if ((context = strchr(tmp, '@'))) {
 		*context++ = '\0';
-	else
+	} else {
 		context = "default";
+	}
 
-	if (newmsgs)
+	if (newmsgs) {
 		*newmsgs = __has_voicemail(context, tmp, "INBOX", 0);
-	if (oldmsgs)
+	}
+	if (oldmsgs) {
 		*oldmsgs = __has_voicemail(context, tmp, "Old", 0);
-	if (urgentmsgs)
+	}
+	if (urgentmsgs) {
 		*urgentmsgs = __has_voicemail(context, tmp, "Urgent", 0);
+	}
 
 	return 0;
 }
@@ -13241,7 +13259,10 @@ static void stop_poll_thread(void)
 	poll_thread = AST_PTHREADT_NULL;
 }
 
-/*! \brief Append vmu info string into given astman with event_name. */
+/*!
+ * \brief Append vmu info string into given astman with event_name.
+ * \return 0 failed. 1 otherwise.
+*/
 static int append_vmu_info_astman(
 		struct mansession *s,
 		struct ast_vm_user *vmu,
@@ -13251,14 +13272,33 @@ static int append_vmu_info_astman(
 {
 	int new;
 	int old;
+	char *mailbox;
+	int ret;
 
 	if((s == NULL) || (vmu == NULL) || (event_name == NULL) || (actionid == NULL)) {
 		ast_log(LOG_ERROR, "Wrong input parameter.");
 		return 0;
 	}
 
+	/* create mailbox string */
+	if (!ast_strlen_zero(vmu->context)) {
+		ret = ast_asprintf(&mailbox, "%s@%s", vmu->mailbox, vmu->context);
+	} else {
+		ret = ast_asprintf(&mailbox, "%s", vmu->mailbox);
+	}
+	if (ret == -1) {
+		ast_log(LOG_ERROR, "Could not create mailbox string. err[%s]\n", strerror(errno));
+		return 0;
+	}
+
 	/* get mailbox count */
-	inboxcount(vmu->mailbox, &new, &old);
+	ret = inboxcount(mailbox, &new, &old);
+	ast_free(mailbox);
+	if (ret == -1) {
+		ast_log(LOG_ERROR, "Could not get mailbox count. user[%s], context[%s]\n",
+			vmu->mailbox ?: "", vmu->context ?: "");
+		return 0;
+	}
 
 	astman_append(s,
 		"Event: %s\r\n"
-- 
GitLab