aboutsummaryrefslogtreecommitdiffstats
path: root/apps/app_voicemail.c
diff options
context:
space:
mode:
authortilghman <tilghman@f38db490-d61c-443f-a65b-d21fe96a405b>2008-08-04 17:03:46 +0000
committertilghman <tilghman@f38db490-d61c-443f-a65b-d21fe96a405b>2008-08-04 17:03:46 +0000
commitd3e327c3c2eca66df71c4e9a1a8986d3a352d6f2 (patch)
tree3329c7f9e3b30198501d442949c6ff2dae24c6bd /apps/app_voicemail.c
parent785e0ffa9e77ee0c43433798f47200b7ae00bf2b (diff)
Merged revisions 135480 via svnmerge from
https://origsvn.digium.com/svn/asterisk/trunk ................ r135480 | tilghman | 2008-08-04 11:58:29 -0500 (Mon, 04 Aug 2008) | 14 lines Merged revisions 135479 via svnmerge from https://origsvn.digium.com/svn/asterisk/branches/1.4 ........ r135479 | tilghman | 2008-08-04 11:56:19 -0500 (Mon, 04 Aug 2008) | 6 lines Memory leak on unload (closes issue #13231) Reported by: eliel Patches: app_voicemail.leak.patch uploaded by eliel (license 64) ........ ................ git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.6.0@135481 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'apps/app_voicemail.c')
-rw-r--r--apps/app_voicemail.c43
1 files changed, 32 insertions, 11 deletions
diff --git a/apps/app_voicemail.c b/apps/app_voicemail.c
index 8b57b6b43..2f7bd55f0 100644
--- a/apps/app_voicemail.c
+++ b/apps/app_voicemail.c
@@ -8284,10 +8284,31 @@ static int manager_list_voicemail_users(struct mansession *s, const struct messa
return RESULT_SUCCESS;
}
-static int load_config(int reload)
+/*! \brief Free the users structure. */
+static void free_vm_users(void)
{
struct ast_vm_user *cur;
+ AST_LIST_LOCK(&users);
+ while ((cur = AST_LIST_REMOVE_HEAD(&users, list))) {
+ ast_set_flag(cur, VM_ALLOCED);
+ free_user(cur);
+ }
+ AST_LIST_UNLOCK(&users);
+}
+
+/*! \brief Free the zones structure. */
+static void free_vm_zones(void)
+{
struct vm_zone *zcur;
+ AST_LIST_LOCK(&zones);
+ while ((zcur = AST_LIST_REMOVE_HEAD(&zones, list)))
+ free_zone(zcur);
+ AST_LIST_UNLOCK(&zones);
+}
+
+static int load_config(int reload)
+{
+ struct ast_vm_user *cur;
struct ast_config *cfg, *ucfg;
char *cat;
struct ast_variable *var;
@@ -8315,17 +8336,14 @@ static int load_config(int reload)
strcpy(listen_control_pause_key, DEFAULT_LISTEN_CONTROL_PAUSE_KEY);
strcpy(listen_control_restart_key, DEFAULT_LISTEN_CONTROL_RESTART_KEY);
strcpy(listen_control_stop_key, DEFAULT_LISTEN_CONTROL_STOP_KEY);
-
- AST_LIST_LOCK(&users);
- while ((cur = AST_LIST_REMOVE_HEAD(&users, list))) {
- ast_set_flag(cur, VM_ALLOCED);
- free_user(cur);
- }
- AST_LIST_LOCK(&zones);
- while ((zcur = AST_LIST_REMOVE_HEAD(&zones, list)))
- free_zone(zcur);
- AST_LIST_UNLOCK(&zones);
+ /* Free all the users structure */
+ free_vm_users();
+
+ /* Free all the zones structure */
+ free_vm_zones();
+
+ AST_LIST_LOCK(&users);
memset(ext_pass_cmd, 0, sizeof(ext_pass_cmd));
@@ -8947,6 +8965,9 @@ static int unload_module(void)
if (poll_thread != AST_PTHREADT_NULL)
stop_poll_thread();
+
+ free_vm_users();
+ free_vm_zones();
return res;
}