diff options
author | tilghman <tilghman@f38db490-d61c-443f-a65b-d21fe96a405b> | 2008-08-04 16:56:19 +0000 |
---|---|---|
committer | tilghman <tilghman@f38db490-d61c-443f-a65b-d21fe96a405b> | 2008-08-04 16:56:19 +0000 |
commit | d42d831334e2c6b6346b47275de541f5fa2f3680 (patch) | |
tree | 1d95a7456f397ad9b36126ad14343f7ba2e2d3a7 /apps | |
parent | 201416b253e691587a2b0f198929e1f2cfe56b2a (diff) |
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.4@135479 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'apps')
-rw-r--r-- | apps/app_voicemail.c | 31 |
1 files changed, 21 insertions, 10 deletions
diff --git a/apps/app_voicemail.c b/apps/app_voicemail.c index 61bdfc45a..09a630445 100644 --- a/apps/app_voicemail.c +++ b/apps/app_voicemail.c @@ -7844,10 +7844,28 @@ static struct ast_cli_entry cli_voicemail[] = { voicemail_show_zones_help, NULL, &cli_show_voicemail_zones_deprecated }, }; -static int load_config(void) +static void free_vm_users(void) { struct ast_vm_user *cur; struct vm_zone *zcur; + + 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); + + AST_LIST_LOCK(&zones); + while ((zcur = AST_LIST_REMOVE_HEAD(&zones, list))) { + free_zone(zcur); + } + AST_LIST_UNLOCK(&zones); +} + +static int load_config(void) +{ + struct ast_vm_user *cur; struct ast_config *cfg, *ucfg; char *cat; struct ast_variable *var; @@ -7897,16 +7915,9 @@ static int load_config(void) cfg = ast_config_load(VOICEMAIL_CONFIG); - AST_LIST_LOCK(&users); - while ((cur = AST_LIST_REMOVE_HEAD(&users, list))) { - ast_set_flag(cur, VM_ALLOCED); - free_user(cur); - } + free_vm_users(); - AST_LIST_LOCK(&zones); - while ((zcur = AST_LIST_REMOVE_HEAD(&zones, list))) - free_zone(zcur); - AST_LIST_UNLOCK(&zones); + AST_LIST_LOCK(&users); memset(ext_pass_cmd, 0, sizeof(ext_pass_cmd)); |