From 0785fad14fcf3a76621ba6eb681d4e6f5318274b Mon Sep 17 00:00:00 2001 From: Tilghman Lesher Date: Mon, 4 Aug 2008 16:58:29 +0000 Subject: 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: https://origsvn.digium.com/svn/asterisk/trunk@135480 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- apps/app_voicemail.c | 43 ++++++++++++++++++++++++++++++++----------- 1 file changed, 32 insertions(+), 11 deletions(-) (limited to 'apps/app_voicemail.c') diff --git a/apps/app_voicemail.c b/apps/app_voicemail.c index 9df3d4f12..ffaad3889 100644 --- a/apps/app_voicemail.c +++ b/apps/app_voicemail.c @@ -9557,10 +9557,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; @@ -9591,17 +9612,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)); memset(ext_pass_check_cmd, 0, sizeof(ext_pass_check_cmd)); @@ -10263,6 +10281,9 @@ static int unload_module(void) mwi_subscription_tps = ast_taskprocessor_unreference(mwi_subscription_tps); ast_unload_realtime("voicemail"); ast_unload_realtime("voicemail_data"); + + free_vm_users(); + free_vm_zones(); return res; } -- cgit v1.2.3