From d6cb4db77da6cb9be13f23939b5208af1a63a937 Mon Sep 17 00:00:00 2001
From: Morris Jette <jette@schedmd.com>
Date: Thu, 29 Dec 2016 19:51:51 -0700
Subject: [PATCH] Fix some memory leaks reported by Coverity

---
 src/sinfo/sort.c | 87 ++++++++++++++++++++++++++----------------------
 1 file changed, 48 insertions(+), 39 deletions(-)

diff --git a/src/sinfo/sort.c b/src/sinfo/sort.c
index e72e5d7173d..d77efaa9da5 100644
--- a/src/sinfo/sort.c
+++ b/src/sinfo/sort.c
@@ -425,6 +425,7 @@ static int _sort_by_node_addr(void *void1, void *void2)
 	sinfo_data_t *sinfo1;
 	sinfo_data_t *sinfo2;
 	char *val1, *val2;
+	char *ptr1, *ptr2;
 #if	PURE_ALPHA_SORT == 0
 	int inx;
 #endif
@@ -435,39 +436,41 @@ static int _sort_by_node_addr(void *void1, void *void2)
 	if (val1) {
 		hostlist_push_host(sinfo1->node_addr, val1);
 		hostlist_sort(sinfo1->node_addr);
+		ptr1 = val1;
 	} else
-		val1 = "";
+		ptr1 = "";
 
 	val2 = hostlist_shift(sinfo2->node_addr);
 	if (val2) {
 		hostlist_push_host(sinfo2->node_addr, val2);
 		hostlist_sort(sinfo2->node_addr);
+		ptr2 = val2;
 	} else
-		val2 = "";
+		ptr2 = "";
 
 #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)
@@ -482,6 +485,7 @@ static int _sort_by_hostnames(void *void1, void *void2)
 	sinfo_data_t *sinfo1;
 	sinfo_data_t *sinfo2;
 	char *val1, *val2;
+	char *ptr1, *ptr2;
 #if	PURE_ALPHA_SORT == 0
 	int inx;
 #endif
@@ -492,39 +496,41 @@ static int _sort_by_hostnames(void *void1, void *void2)
 	if (val1) {
 		hostlist_push_host(sinfo1->hostnames, val1);
 		hostlist_sort(sinfo1->hostnames);
+		ptr1 = val1;
 	} else
-		val1 = "";
+		ptr1 = "";
 
 	val2 = hostlist_shift(sinfo2->hostnames);
 	if (val2) {
 		hostlist_push_host(sinfo2->hostnames, val2);
 		hostlist_sort(sinfo2->hostnames);
+		ptr2 = val2;
 	} else
-		val2 = "";
+		ptr2 = "";
 
 #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)
@@ -600,6 +606,7 @@ static int _sort_by_node_list(void *void1, void *void2)
 	sinfo_data_t *sinfo1;
 	sinfo_data_t *sinfo2;
 	char *val1, *val2;
+	char *ptr1, *ptr2;
 #if	PURE_ALPHA_SORT == 0
 	int inx;
 #endif
@@ -610,39 +617,41 @@ static int _sort_by_node_list(void *void1, void *void2)
 	if (val1) {
 		hostlist_push_host(sinfo1->nodes, val1);
 		hostlist_sort(sinfo1->nodes);
+		ptr1 = val1;
 	} else
-		val1 = "";
+		ptr1 = "";
 
 	val2 = hostlist_shift(sinfo2->nodes);
 	if (val2) {
 		hostlist_push_host(sinfo2->nodes, val2);
 		hostlist_sort(sinfo2->nodes);
+		ptr2 = val2;
 	} else
-		val2 = "";
+		ptr2 = "";
 
 #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