From bab6b3610a0131b57b3f91d8cbe46f89e0b4e05e Mon Sep 17 00:00:00 2001
From: Jonathan Rose <jrose@digium.com>
Date: Wed, 23 Oct 2013 19:55:05 +0000
Subject: [PATCH] memory leaks: Memory leak cleanup patch by Corey Farrell
 (first set)

(issue ASTERSIK-22467)
Reported by: Corey Farrell
Patches:
    chan_sip-parse_contact_header_test-free-contacts.patch uploaded by coreyfarrell (license 5909)
    cli-filename-completion-leak.patch uploaded by coreyfarrell (license 5909)
    func_math.patch uploaded by corefarrell (license 5909)
    main-test-cleanup.patch uploaded by coreyfarrell (license 5909)
    test_dlinklists.patch uploaded by coreyfarrell (license 5909)
........

Merged revisions 401660 from http://svn.asterisk.org/svn/asterisk/branches/1.8


git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/11@401661 65c4cc65-6c06-0410-ace0-fbb531ad65f3
---
 channels/sip/reqresp_parser.c | 4 ++++
 funcs/func_math.c             | 3 +++
 main/editline/readline.c      | 7 ++++++-
 main/test.c                   | 6 ++++++
 tests/test_dlinklists.c       | 2 ++
 5 files changed, 21 insertions(+), 1 deletion(-)

diff --git a/channels/sip/reqresp_parser.c b/channels/sip/reqresp_parser.c
index 2d48335387..f96bb99c82 100644
--- a/channels/sip/reqresp_parser.c
+++ b/channels/sip/reqresp_parser.c
@@ -1562,6 +1562,10 @@ AST_TEST_DEFINE(parse_contact_header_test)
 
 				contactptr = AST_LIST_NEXT(contactptr,list);
 			}
+
+			while ((contactptr = AST_LIST_REMOVE_HEAD(contactlistptr,list))) {
+				ast_free(contactptr);
+			}
 		}
 	}
 
diff --git a/funcs/func_math.c b/funcs/func_math.c
index 05321b719c..36f3fc48a6 100644
--- a/funcs/func_math.c
+++ b/funcs/func_math.c
@@ -503,6 +503,9 @@ AST_TEST_DEFINE(test_MATH_function)
 		res = AST_TEST_FAIL;
 	}
 
+	ast_free(expr);
+	ast_free(result);
+
 	return res;
 }
 #endif
diff --git a/main/editline/readline.c b/main/editline/readline.c
index adf054d633..d202adbbd8 100644
--- a/main/editline/readline.c
+++ b/main/editline/readline.c
@@ -1236,8 +1236,11 @@ filename_completion_function(const char *text, int state)
 	filename_len = strlen(filename);
 
 	dir = opendir(dirname ? dirname : ".");
-	if (!dir)
+	if (!dir) {
+		free(filename);
+		free(dirname);
 		return (NULL);	/* cannot open the directory */
+	}
 
 	/* find the match */
 	while ((entry = readdir(dir)) != NULL) {
@@ -1274,6 +1277,8 @@ filename_completion_function(const char *text, int state)
 	} else
 		temp = NULL;
 	closedir(dir);
+	free(filename);
+	free(dirname);
 
 	return (temp);
 }
diff --git a/main/test.c b/main/test.c
index 16973ba1e7..1224b702d6 100644
--- a/main/test.c
+++ b/main/test.c
@@ -931,6 +931,11 @@ int __ast_test_suite_assert_notify(const char *file, const char *func, int line,
 	return 0;
 }
 
+static void test_shutdown(void)
+{
+	ast_cli_unregister_multiple(test_cli, ARRAY_LEN(test_cli));
+}
+
 #endif /* TEST_FRAMEWORK */
 
 int ast_test_init()
@@ -938,6 +943,7 @@ int ast_test_init()
 #ifdef TEST_FRAMEWORK
 	/* Register cli commands */
 	ast_cli_register_multiple(test_cli, ARRAY_LEN(test_cli));
+	ast_register_atexit(test_shutdown);
 #endif
 
 	return 0;
diff --git a/tests/test_dlinklists.c b/tests/test_dlinklists.c
index ec13851d79..197dd757ab 100644
--- a/tests/test_dlinklists.c
+++ b/tests/test_dlinklists.c
@@ -337,6 +337,7 @@ static void dll_tests(void)
 
 		if (e == b) {
 			AST_DLLIST_REMOVE_CURRENT(list);  /* C A */
+			free(b);
 			print_list(tc, "C <=> A");
 		}
 		if (e == a) {
@@ -348,6 +349,7 @@ static void dll_tests(void)
 	AST_DLLIST_TRAVERSE_SAFE_END;
 	print_list(tc, "C <=> A <=> D");
 
+	destroy_test_container(tc);
 }
 
 static int unload_module(void)
-- 
GitLab