From e0c9bd266cdc1c19b3f729ca16f08e11d630e36c Mon Sep 17 00:00:00 2001
From: Morris Jette <jette@schedmd.com>
Date: Thu, 29 Dec 2016 15:27:38 -0700
Subject: [PATCH] Fix several memory leaks reported by Coverity

---
 src/sprio/opts.c  | 19 +++++++++--------
 src/squeue/opts.c | 52 +++++++++++++++++++++++++----------------------
 src/squeue/sort.c | 35 +++++++++++++++++--------------
 3 files changed, 58 insertions(+), 48 deletions(-)

diff --git a/src/sprio/opts.c b/src/sprio/opts.c
index 0fa47e7a6e1..0ba950fdcb7 100644
--- a/src/sprio/opts.c
+++ b/src/sprio/opts.c
@@ -447,29 +447,30 @@ _build_job_list( char* str )
  * RET List of UIDs (uint32_t)
  */
 static List
-_build_user_list( char* str )
+_build_user_list(char* str)
 {
 	List my_list;
 	char *user = NULL;
 	char *tmp_char = NULL, *my_user_list = NULL;
 	uid_t uid = (uid_t) 0;
 
-	if ( str == NULL)
+	if (str == NULL)
 		return NULL;
 
-	my_list = list_create( NULL );
-	my_user_list = xstrdup( str );
-	user = strtok_r( my_user_list, ",", &tmp_char );
+	my_list = list_create(NULL);
+	my_user_list = xstrdup(str);
+	user = strtok_r(my_user_list, ",", &tmp_char);
 	while (user) {
-		if (uid_from_string (user, &uid) < 0) {
-			error( "Invalid user: %s\n", user);
+		if (uid_from_string(user, &uid) < 0) {
+			error("Invalid user: %s\n", user);
 		} else {
-			uint32_t *u_tmp = xmalloc( sizeof( uint32_t ));
+			uint32_t *u_tmp = xmalloc(sizeof( uint32_t ));
 			*u_tmp = (uint32_t) uid;
-			list_append( my_list, u_tmp );
+			list_append(my_list, u_tmp);
 		}
 		user = strtok_r (NULL, ",", &tmp_char);
 	}
+	xfree(my_user_list);
 	return my_list;
 }
 
diff --git a/src/squeue/opts.c b/src/squeue/opts.c
index 1c93224fdc6..551bad42ade 100644
--- a/src/squeue/opts.c
+++ b/src/squeue/opts.c
@@ -1789,7 +1789,7 @@ static List
 _build_str_list(char* str)
 {
 	List my_list;
-	char *tok = NULL, *tmp_char = NULL, *my_str = NULL;
+	char *elem, *tok = NULL, *tmp_char = NULL, *my_str = NULL;
 
 	if (str == NULL)
 		return NULL;
@@ -1797,11 +1797,11 @@ _build_str_list(char* str)
 	my_str = xstrdup(str);
 	tok = strtok_r(my_str, ",", &tmp_char);
 	while (tok) {
-		list_append(my_list, tok);
+		elem = xstrdup(tok);
+		list_append(my_list, elem);
 		tok = strtok_r(NULL, ",", &tmp_char);
 	}
-	/* NOTE: Do NOT xfree my_list or the elements just added to the
-	 * list will also be freed. */
+	xfree(my_str);
 	return my_list;
 }
 
@@ -1817,22 +1817,22 @@ _build_state_list( char* str )
 	char *state = NULL, *tmp_char = NULL, *my_state_list = NULL;
 	uint32_t *state_id = NULL;
 
-	if ( str == NULL)
+	if (str == NULL)
 		return NULL;
-	if ( xstrcasecmp( str, "all" ) == 0 )
+	if (xstrcasecmp( str, "all") == 0)
 		return _build_all_states_list ();
 
-	my_list = list_create( NULL );
-	my_state_list = xstrdup( str );
+	my_list = list_create(NULL);
+	my_state_list = xstrdup(str);
 	state = strtok_r( my_state_list, ",", &tmp_char );
-	while (state)
-	{
-		state_id = xmalloc( sizeof( uint32_t ) );
-		if ( _parse_state( state, state_id ) != SLURM_SUCCESS )
-			exit( 1 );
-		list_append( my_list, state_id );
-		state = strtok_r( NULL, ",", &tmp_char );
+	while (state) {
+		state_id = xmalloc(sizeof(uint32_t));
+		if (_parse_state(state, state_id) != SLURM_SUCCESS)
+			exit(1);
+		list_append(my_list, state_id);
+		state = strtok_r(NULL, ",", &tmp_char);
 	}
+	xfree(my_state_list);
 	return my_list;
 
 }
@@ -1928,23 +1928,25 @@ _build_user_list( char* str )
 	char *user = NULL;
 	char *tmp_char = NULL, *my_user_list = NULL;
 
-	if ( str == NULL )
+	if (str == NULL)
 		return NULL;
-	my_list = list_create( NULL );
-	my_user_list = xstrdup( str );
-	user = strtok_r( my_user_list, ",", &tmp_char );
+
+	my_list = list_create(NULL);
+	my_user_list = xstrdup(str);
+	user = strtok_r(my_user_list, ",", &tmp_char);
 	while (user) {
 		uid_t some_uid;
-		if ( uid_from_string( user, &some_uid ) == 0 ) {
+		if (uid_from_string(user, &some_uid) == 0) {
 			uint32_t *user_id = NULL;
-			user_id = xmalloc( sizeof( uint32_t ));
+			user_id = xmalloc(sizeof(uint32_t));
 			*user_id = (uint32_t) some_uid;
-			list_append( my_list, user_id );
+			list_append(my_list, user_id);
 		} else {
-			error( "Invalid user: %s\n", user);
+			error("Invalid user: %s\n", user);
 		}
-		user = strtok_r (NULL, ",", &tmp_char);
+		user = strtok_r(NULL, ",", &tmp_char);
 	}
+	xfree(my_user_list);
 	return my_list;
 }
 
@@ -2029,9 +2031,11 @@ _check_node_names(hostset_t names)
 	while ((host = hostlist_next(itr))) {
 		if (!_find_a_host(host, node_info)) {
 			error("Invalid node name %s", host);
+			free(host);
 			hostlist_iterator_destroy(itr);
 			return false;
 		}
+		free(host);
 	}
 	hostlist_iterator_destroy(itr);
 
diff --git a/src/squeue/sort.c b/src/squeue/sort.c
index 76c72d5d499..3e3143581a0 100644
--- a/src/squeue/sort.c
+++ b/src/squeue/sort.c
@@ -869,6 +869,7 @@ static int _sort_step_by_node_list(void *void1, void *void2)
 
 	hostlist_t hostlist1, hostlist2;
 	char *val1, *val2;
+	char *ptr1, *ptr2;
 #if	PURE_ALPHA_SORT == 0
 	int inx;
 #endif
@@ -878,40 +879,44 @@ static int _sort_step_by_node_list(void *void1, void *void2)
 	hostlist1 = hostlist_create(step1->nodes);
 	hostlist_sort(hostlist1);
 	val1 = hostlist_shift(hostlist1);
-	if (val1 == NULL)
-		val1 = "";
+	if (val1)
+		ptr1 = val1;
+	else
+		ptr1 = "";
 	hostlist_destroy(hostlist1);
 
 	hostlist2 = hostlist_create(step2->nodes);
 	hostlist_sort(hostlist2);
 	val2 = hostlist_shift(hostlist2);
-	if (val2 == NULL)
-		val2 = "";
+	if (val2)
+		ptr2 = val2;
+	else
+		ptr2 = "";
 	hostlist_destroy(hostlist2);
 
 #if	PURE_ALPHA_SORT
-	diff = xstrcmp(val1, val2);
+	diff = xstrcmp(ptr1, ptr2);
 #else
-	for (inx=0; ; inx++) {
-		if (val1[inx] == val2[inx]) {
-			if (val1[inx] == '\0')
+	for (inx = 0; ; inx++) {
+		if (ptr1[inx] == ptr2[inx]) {
+			if (ptr1[inx] == '\0')
 				break;
 			continue;
 		}
-		if ((isdigit((int)val1[inx])) &&
-		    (isdigit((int)val2[inx]))) {
+		if ((isdigit((int)ptr1[inx])) &&
+		    (isdigit((int)ptr2[inx]))) {
 			int num1, num2;
-			num1 = atoi(val1+inx);
-			num2 = atoi(val2+inx);
+			num1 = atoi(ptr1 + inx);
+			num2 = atoi(ptr2 + inx);
 			diff = num1 - num2;
 		} else
-			diff = xstrcmp(val1, val2);
+			diff = xstrcmp(ptr1, ptr2);
 		break;
 	}
 #endif
-	if (strlen(val1))
+	if (val1)
 		free(val1);
-	if (strlen(val2))
+	if (val2)
 		free(val2);
 
 	if (reverse_order)
-- 
GitLab