From 4952835d93e7a42bd4a9f02fd1927c52bea9c41e Mon Sep 17 00:00:00 2001
From: Mark Spencer <markster@digium.com>
Date: Tue, 8 Apr 2003 13:45:36 +0000
Subject: [PATCH] Fix some leaks in CLI (thanks James)

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@777 65c4cc65-6c06-0410-ace0-fbb531ad65f3
---
 asterisk.c | 10 +++++-----
 cli.c      | 12 ++++++++++--
 2 files changed, 15 insertions(+), 7 deletions(-)

diff --git a/asterisk.c b/asterisk.c
index 8b4ae4504c..b0635c7f2f 100755
--- a/asterisk.c
+++ b/asterisk.c
@@ -686,14 +686,14 @@ static int ast_el_read_char(EditLine *el, char *cp)
 
 static char *cli_prompt(EditLine *el)
 {
-	char prompt[80];
+	static char prompt[80];
 
 	if (remotehostname)
 		snprintf(prompt, sizeof(prompt), ASTERISK_PROMPT2, remotehostname);
 	else
 		snprintf(prompt, sizeof(prompt), ASTERISK_PROMPT);
 
-	return strdup(prompt);
+	return(prompt);	
 }
 
 static char **ast_el_strtoarr(char *buf)
@@ -839,7 +839,7 @@ static char *cli_complete(EditLine *el, int ch)
 
 		if (nummatches == 1) {
 			/* Found an exact match */
-			el_insertstr(el, strdup(" "));
+			el_insertstr(el, " ");
 			retval = CC_REFRESH;
 		} else {
 			/* Must be more than one match */
@@ -854,11 +854,11 @@ static char *cli_complete(EditLine *el, int ch)
 				ast_cli_display_match_list(matches, nummatches, maxlen);
 				retval = CC_REDISPLAY;
 			} else { 
-				el_insertstr(el,strdup(" "));
+				el_insertstr(el," ");
 				retval = CC_REFRESH;
 			}
 		}
-
+	free(matches);
 	}
 
 	return (char *)retval;
diff --git a/cli.c b/cli.c
index b9cb021d12..340e8c1d7f 100755
--- a/cli.c
+++ b/cli.c
@@ -278,7 +278,10 @@ static int handle_commandmatchesarray(int fd, int argc, char *argv[])
 			printf("command matchesarray for '%s' %s got '%s'\n", argv[2], argv[3], matches[x]);
 #endif
 			len += sprintf( buf + len, "%s ", matches[x]);
+			free(matches[x]);
+			matches[x] = NULL;
 		}
+		free(matches);
 	}
 #if 0
 	printf("array for '%s' %s got '%s'\n", argv[2], argv[3], buf);
@@ -765,12 +768,16 @@ normal:
 int ast_cli_generatornummatches(char *text, char *word)
 {
 	int matches = 0, i = 0;
-	char *buf, *oldbuf;
+	char *buf, *oldbuf = NULL;
 
 
 	while ( (buf = ast_cli_generator(text, word, i)) ) {
-		if (++i > 1 && strcmp(buf,oldbuf) == 0)  
+		if (++i > 1 && strcmp(buf,oldbuf) == 0)  {
+				free(buf);
 				continue;
+		}
+		if (oldbuf)
+			free(oldbuf);
 		oldbuf = buf;
 		matches++;
 	}
@@ -866,6 +873,7 @@ static char *__ast_cli_generator(char *text, char *word, int state, int lock)
 					if (res) {
 						if (lock)
 							ast_pthread_mutex_unlock(&clilock);
+						free(dup);
 						return res ? strdup(res) : NULL;
 					}
 				}
-- 
GitLab