Blame SOURCES/irqbalance-1.4.0-Fix-several-memleak-problems-found-by-covscan.patch

d10306
From 9ed5c269bd59c95f41829aedf0520930c97b08d3 Mon Sep 17 00:00:00 2001
d10306
From: Kairui Song <kasong@redhat.com>
d10306
Date: Thu, 30 Aug 2018 17:45:53 +0800
d10306
Subject: Fix several memleak problems found by covscan
d10306
d10306
Some memleak issues is found by static analysis tools, and can confirm
d10306
irqbalance is leaking memory slowly when there are incomming connection
d10306
to socket.
d10306
d10306
This patch could solve the memleak problem.
d10306
---
d10306
 irqbalance.c       | 16 ++++++++++++----
d10306
 ui/irqbalance-ui.c | 31 +++++++++++++++++++++++++++----
d10306
 ui/ui.c            |  2 ++
d10306
 3 files changed, 41 insertions(+), 8 deletions(-)
d10306
d10306
diff --git a/irqbalance.c b/irqbalance.c
d10306
index 6412447..4b3de54 100644
d10306
--- a/irqbalance.c
d10306
+++ b/irqbalance.c
d10306
@@ -385,11 +385,11 @@ gboolean sock_handle(gint fd, GIOCondition condition, gpointer user_data __attri
d10306
 		sock = accept(fd, NULL, NULL);
d10306
 		if (sock < 0) {
d10306
 			log(TO_ALL, LOG_WARNING, "Connection couldn't be accepted.\n");
d10306
-			return TRUE;
d10306
+			goto out;
d10306
 		}
d10306
 		if ((recv_size = recvmsg(sock, &msg, 0)) < 0) {
d10306
 			log(TO_ALL, LOG_WARNING, "Error while receiving data.\n");
d10306
-			return TRUE;
d10306
+			goto out;
d10306
 		}
d10306
 		cmsg = CMSG_FIRSTHDR(&msg;;
d10306
 		if ((cmsg->cmsg_level == SOL_SOCKET) &&
d10306
@@ -401,7 +401,7 @@ gboolean sock_handle(gint fd, GIOCondition condition, gpointer user_data __attri
d10306
 		}
d10306
 		if (!valid_user) {
d10306
 			log(TO_ALL, LOG_INFO, "Permission denied for user to connect to socket.\n");
d10306
-			return TRUE;
d10306
+			goto out;
d10306
 		}
d10306
 
d10306
 		if (!strncmp(buff, "stats", strlen("stats"))) {
d10306
@@ -421,6 +421,7 @@ gboolean sock_handle(gint fd, GIOCondition condition, gpointer user_data __attri
d10306
 				if (new_iterval >= 1) {
d10306
 					sleep_interval = new_iterval;
d10306
 				}
d10306
+				free(sleep_string);
d10306
 			} else if (!(strncmp(buff + strlen("settings "), "ban irqs ",
d10306
 							strlen("ban irqs ")))) {
d10306
 				char *end;
d10306
@@ -432,12 +433,14 @@ gboolean sock_handle(gint fd, GIOCondition condition, gpointer user_data __attri
d10306
 				cl_banned_irqs = NULL;
d10306
 				need_rescan = 1;
d10306
 				if (!strncmp(irq_string, "NONE", strlen("NONE"))) {
d10306
-					return TRUE;
d10306
+					free(irq_string);
d10306
+					goto out;
d10306
 				}
d10306
 				int irq = strtoul(irq_string, &end, 10);
d10306
 				do {
d10306
 					add_cl_banned_irq(irq);
d10306
 				} while((irq = strtoul(end, &end, 10)));
d10306
+				free(irq_string);
d10306
 			} else if (!(strncmp(buff + strlen("settings "), "cpus ",
d10306
 							strlen("cpus")))) {
d10306
 				char *cpu_ban_string = malloc(
d10306
@@ -449,6 +452,7 @@ gboolean sock_handle(gint fd, GIOCondition condition, gpointer user_data __attri
d10306
 					banned_cpumask_from_ui = NULL;
d10306
 				}
d10306
 				need_rescan = 1;
d10306
+				free(cpu_ban_string);
d10306
 			}
d10306
 		}
d10306
 		if (!strncmp(buff, "setup", strlen("setup"))) {
d10306
@@ -463,10 +467,14 @@ gboolean sock_handle(gint fd, GIOCondition condition, gpointer user_data __attri
d10306
 			snprintf(setup + strlen(setup), strlen(banned) + 7 + 1,
d10306
 					"BANNED %s", banned);
d10306
 			send(sock, setup, strlen(setup), 0);
d10306
+			free(setup);
d10306
 		}
d10306
 
d10306
 		close(sock);
d10306
 	}
d10306
+
d10306
+out:
d10306
+	free(msg.msg_control);
d10306
 	return TRUE;
d10306
 }
d10306
 
d10306
diff --git a/ui/irqbalance-ui.c b/ui/irqbalance-ui.c
d10306
index 3fc46af..99f2ca2 100644
d10306
--- a/ui/irqbalance-ui.c
d10306
+++ b/ui/irqbalance-ui.c
d10306
@@ -41,6 +41,7 @@ struct msghdr * create_credentials_msg()
d10306
 	cmsg->cmsg_len = CMSG_LEN(sizeof(struct ucred));
d10306
 	memcpy(CMSG_DATA(cmsg), credentials, sizeof(struct ucred));
d10306
 
d10306
+	free(credentials);
d10306
 	return msg;
d10306
 }
d10306
 
d10306
@@ -87,6 +88,8 @@ void send_settings(char *data)
d10306
 	sendmsg(socket_fd, msg, 0);
d10306
 
d10306
 	close(socket_fd);
d10306
+	free(msg->msg_control);
d10306
+	free(msg);
d10306
 }
d10306
 
d10306
 char * get_data(char *string)
d10306
@@ -115,6 +118,8 @@ char * get_data(char *string)
d10306
 	int len = recv(socket_fd, data, 8192, 0);
d10306
 	close(socket_fd);
d10306
 	data[len] = '\0';
d10306
+	free(msg->msg_control);
d10306
+	free(msg);
d10306
 	return data;
d10306
 }
d10306
 
d10306
@@ -123,6 +128,7 @@ void parse_setup(char *setup_data)
d10306
 	char *token, *ptr;
d10306
 	int i,j;
d10306
 	char *copy;
d10306
+	irq_t *new_irq = NULL;
d10306
 	if((setup_data == NULL) || (strlen(setup_data) == 0)) return;
d10306
 	copy = strdup(setup_data);
d10306
 	if (!copy)
d10306
@@ -136,7 +142,7 @@ void parse_setup(char *setup_data)
d10306
 	token = strtok_r(NULL, " ", &ptr);
d10306
 	/* Parse banned IRQ data */
d10306
 	while(!strncmp(token, "IRQ", strlen("IRQ"))) {
d10306
-		irq_t *new_irq = malloc(sizeof(irq_t));
d10306
+		new_irq = malloc(sizeof(irq_t));
d10306
 		new_irq->vector = strtol(strtok_r(NULL, " ", &ptr), NULL, 10);
d10306
 		token = strtok_r(NULL, " ", &ptr);
d10306
 		if(strncmp(token, "LOAD", strlen("LOAD"))) goto out;
d10306
@@ -151,6 +157,7 @@ void parse_setup(char *setup_data)
d10306
 		new_irq->assigned_to = NULL;
d10306
 		setup.banned_irqs = g_list_append(setup.banned_irqs, new_irq);
d10306
 		token = strtok_r(NULL, " ", &ptr);
d10306
+		new_irq = NULL;
d10306
 	}
d10306
 
d10306
 	if(strncmp(token, "BANNED", strlen("BANNED"))) goto out;
d10306
@@ -165,6 +172,7 @@ void parse_setup(char *setup_data)
d10306
 								banned_cpu);
d10306
 			}
d10306
 		}
d10306
+		free(map);
d10306
 	
d10306
 	}
d10306
 	free(copy);
d10306
@@ -173,6 +181,9 @@ void parse_setup(char *setup_data)
d10306
 out: {
d10306
 	/* Invalid data presented */
d10306
 	printf("Invalid data sent.  Unexpected token: %s", token);
d10306
+	if (new_irq) {
d10306
+		free(new_irq);
d10306
+	}
d10306
 	free(copy);
d10306
 	g_list_free(tree);
d10306
 	exit(1);
d10306
@@ -240,7 +251,9 @@ void parse_into_tree(char *data)
d10306
 	cpu_node_t *parent = NULL;
d10306
 	char *copy;
d10306
 	tree = NULL;
d10306
-	
d10306
+	irq_t *new_irq = NULL;
d10306
+	cpu_node_t *new = NULL;
d10306
+
d10306
 	if (!data || strlen(data) == 0)
d10306
 		return;
d10306
 
d10306
@@ -255,7 +268,7 @@ void parse_into_tree(char *data)
d10306
 			free(copy);
d10306
 			 goto out;
d10306
 		}
d10306
-		cpu_node_t *new = malloc(sizeof(cpu_node_t));
d10306
+		new = malloc(sizeof(cpu_node_t));
d10306
 		new->irqs = NULL;
d10306
 		new->children = NULL;
d10306
 		new->cpu_list = NULL;
d10306
@@ -279,7 +292,7 @@ void parse_into_tree(char *data)
d10306
 
d10306
 		/* Parse assigned IRQ data */
d10306
 		while((token != NULL) && (!strncmp(token, "IRQ", strlen("IRQ")))) {
d10306
-			irq_t *new_irq = malloc(sizeof(irq_t));
d10306
+			new_irq = malloc(sizeof(irq_t));
d10306
 			new_irq->vector = strtol(strtok_r(NULL, " ", &ptr), NULL, 10);
d10306
 			token = strtok_r(NULL, " ", &ptr);
d10306
 			if(strncmp(token, "LOAD", strlen("LOAD"))) goto out;
d10306
@@ -293,6 +306,7 @@ void parse_into_tree(char *data)
d10306
 			new_irq->is_banned = 0;
d10306
 			new->irqs = g_list_append(new->irqs, new_irq);
d10306
 			token = strtok_r(NULL, " ", &ptr);
d10306
+			new_irq = NULL;
d10306
 		}
d10306
 
d10306
 		if((token == NULL) || (strncmp(token, "IRQ", strlen("IRQ")))) {
d10306
@@ -306,6 +320,8 @@ void parse_into_tree(char *data)
d10306
 				parent = new;
d10306
 			}
d10306
 		}
d10306
+
d10306
+		new = NULL;
d10306
 	}
d10306
 	free(copy);
d10306
 	for_each_node(tree, assign_cpu_lists, NULL);
d10306
@@ -315,6 +331,12 @@ void parse_into_tree(char *data)
d10306
 out: {
d10306
 	/* Invalid data presented */
d10306
 	printf("Invalid data sent.  Unexpected token: %s\n", token);
d10306
+	if (new_irq) {
d10306
+		free(new_irq);
d10306
+	}
d10306
+	if (new) {
d10306
+		free(new);
d10306
+	}
d10306
 	g_list_free(tree);
d10306
 	exit(1);
d10306
 }
d10306
@@ -330,6 +352,7 @@ gboolean rescan_tree(gpointer data __attribute__((unused)))
d10306
 		display_tree();
d10306
 	}
d10306
 	free(setup_data);
d10306
+	free(irqbalance_data);
d10306
 	return TRUE;
d10306
 }
d10306
 
d10306
diff --git a/ui/ui.c b/ui/ui.c
d10306
index 4054f0e..06ec472 100644
d10306
--- a/ui/ui.c
d10306
+++ b/ui/ui.c
d10306
@@ -71,6 +71,7 @@ char * check_control_in_sleep_input(int max_len, int column_offest, int line_off
d10306
 			attrset(COLOR_PAIR(6));
d10306
 			break;
d10306
 		case 27:
d10306
+			free(input_to);
d10306
 			return NULL;
d10306
 		default:
d10306
 			input_to[iteration] = new;
d10306
@@ -115,6 +116,7 @@ int get_valid_sleep_input(int column_offest)
d10306
 				input);
d10306
 			refresh();
d10306
 		}
d10306
+		free(input);
d10306
 	}
d10306
 
d10306
 	attrset(COLOR_PAIR(1));
d10306
-- 
d10306
2.17.1
d10306