diff options
author | tilghman <tilghman@f38db490-d61c-443f-a65b-d21fe96a405b> | 2008-08-04 17:03:46 +0000 |
---|---|---|
committer | tilghman <tilghman@f38db490-d61c-443f-a65b-d21fe96a405b> | 2008-08-04 17:03:46 +0000 |
commit | d3e327c3c2eca66df71c4e9a1a8986d3a352d6f2 (patch) | |
tree | 3329c7f9e3b30198501d442949c6ff2dae24c6bd /apps | |
parent | 785e0ffa9e77ee0c43433798f47200b7ae00bf2b (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')
-rw-r--r-- | apps/app_voicemail.c | 43 |
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; } |