diff --git a/apps/app_voicemail.c b/apps/app_voicemail.c
index 313f33893c4acbabf8331fd863295239002e6509..a8636a2df0c546a5cfa991d095811ae03c07fb41 100644
--- a/apps/app_voicemail.c
+++ b/apps/app_voicemail.c
@@ -6452,6 +6452,8 @@ static int load_config(void)
 							}
 						} else {
 							free(z);
+							AST_LIST_UNLOCK(&users);
+							ast_config_destroy(cfg);
 							return -1;
 						}
 						var = var->next;
@@ -6706,8 +6708,10 @@ static int advanced_options(struct ast_channel *chan, struct ast_vm_user *vmu, s
 		return 0;
 	}
 
-	if (!(origtime = ast_variable_retrieve(msg_cfg, "message", "origtime")))
+	if (!(origtime = ast_variable_retrieve(msg_cfg, "message", "origtime"))) {
+		ast_config_destroy(msg_cfg);
 		return 0;
+	}
 
 	cid = ast_variable_retrieve(msg_cfg, "message", "callerid");
 
@@ -6715,6 +6719,8 @@ static int advanced_options(struct ast_channel *chan, struct ast_vm_user *vmu, s
 	if (!strncasecmp("macro",context,5)) /* Macro names in contexts are useless for our needs */
 		context = ast_variable_retrieve(msg_cfg, "message","macrocontext");
 
+	ast_config_destroy(msg_cfg);
+
 	switch (option) {
 	case 3:
 		if (!res)
@@ -6852,8 +6858,6 @@ static int advanced_options(struct ast_channel *chan, struct ast_vm_user *vmu, s
 		break;
 	}
 
-	ast_config_destroy(msg_cfg);
-
 	if (!res) {
 		make_file(vms->fn, sizeof(vms->fn), vms->curdir, msg);
 		vms->heard[msg] = 1;