From 7c0ba102e91925fcebf0c4d3a1742df7b8969d7c Mon Sep 17 00:00:00 2001
From: Moe Jette <jette1@llnl.gov>
Date: Tue, 17 Dec 2002 19:57:43 +0000
Subject: [PATCH] Eliminate a bunch of "lost" memory.

---
 src/slurmctld/agent.c       | 11 ++++++-----
 src/slurmctld/controller.c  |  2 ++
 src/slurmctld/job_mgr.c     |  3 +++
 src/slurmctld/read_config.c | 30 ++++++++++++++++++++----------
 4 files changed, 31 insertions(+), 15 deletions(-)

diff --git a/src/slurmctld/agent.c b/src/slurmctld/agent.c
index 4ad9cbde1a2..91f4744f7fd 100644
--- a/src/slurmctld/agent.c
+++ b/src/slurmctld/agent.c
@@ -416,7 +416,7 @@ static void *_thread_per_node_rpc(void *args)
 	int rc;
 	slurm_fd sockfd;
 	slurm_msg_t request_msg;
-	slurm_msg_t response_msg;
+	slurm_msg_t *response_msg = xmalloc(sizeof(slurm_msg_t));
 	return_code_msg_t *slurm_rc_msg;
 	task_info_t *task_ptr = (task_info_t *) args;
 	thd_t *thread_ptr = task_ptr->thread_struct_ptr;
@@ -460,7 +460,7 @@ static void *_thread_per_node_rpc(void *args)
 	}
 
 	/* receive message */
-	if ((msg_size = slurm_receive_msg(sockfd, &response_msg))
+	if ((msg_size = slurm_receive_msg(sockfd, response_msg))
 	    == SLURM_SOCKET_ERROR) {
 		error(
 		    "_thread_per_node_rpc/slurm_receive_msg to host %s: %m",
@@ -481,9 +481,9 @@ static void *_thread_per_node_rpc(void *args)
 		goto cleanup;
 	}
 
-	switch (response_msg.msg_type) {
+	switch (response_msg->msg_type) {
 	case RESPONSE_SLURM_RC:
-		slurm_rc_msg = (return_code_msg_t *) response_msg.data;
+		slurm_rc_msg = (return_code_msg_t *) response_msg->data;
 		rc = slurm_rc_msg->return_code;
 		slurm_free_return_code_msg(slurm_rc_msg);
 		if (rc)
@@ -499,7 +499,7 @@ static void *_thread_per_node_rpc(void *args)
 		break;
 	default:
 		error("_thread_per_node_rpc from host %s, bad msg_type %d",
-		      thread_ptr->node_name, response_msg.msg_type);
+		      thread_ptr->node_name, response_msg->msg_type);
 		break;
 	}
 
@@ -513,6 +513,7 @@ static void *_thread_per_node_rpc(void *args)
 	pthread_cond_signal(task_ptr->thread_cond_ptr);
 	slurm_mutex_unlock(task_ptr->thread_mutex_ptr);
 
+	slurm_free_msg(response_msg);
 	xfree(args);
 	return (void *) NULL;
 }
diff --git a/src/slurmctld/controller.c b/src/slurmctld/controller.c
index 5949e98e3c0..4db83c25ffc 100644
--- a/src/slurmctld/controller.c
+++ b/src/slurmctld/controller.c
@@ -700,6 +700,7 @@ static void _slurmctld_req (slurm_msg_t * msg)
 		break;
 	case REQUEST_OLD_JOB_RESOURCE_ALLOCATION:
 		_slurm_rpc_old_job_alloc(msg);
+		slurm_free_old_job_alloc_msg(msg->data);
 		break;
 	case REQUEST_JOB_WILL_RUN:
 		_slurm_rpc_job_will_run(msg->data);
@@ -1863,6 +1864,7 @@ static void _slurm_rpc_job_step_create(slurm_msg_t * msg)
 		resp.data = &job_step_resp;
 
 		slurm_send_node_msg(msg->conn_fd, &resp);
+		xfree(job_step_resp.node_list);
 		(void) dump_all_job_state();	/* Sets own locks */
 	}
 }
diff --git a/src/slurmctld/job_mgr.c b/src/slurmctld/job_mgr.c
index d8c8f670792..f02799b811c 100644
--- a/src/slurmctld/job_mgr.c
+++ b/src/slurmctld/job_mgr.c
@@ -191,6 +191,7 @@ void delete_job_details(struct job_record *job_entry)
 	if (job_entry->details->magic != DETAILS_MAGIC)
 		fatal
 		    ("delete_job_details: passed invalid job details pointer");
+	FREE_NULL(job_entry->details->credential.node_list);
 	FREE_NULL(job_entry->details->req_nodes);
 	FREE_NULL_BITMAP(job_entry->details->req_node_bitmap);
 	FREE_NULL(job_entry->details->features);
@@ -1923,6 +1924,8 @@ static void _list_delete_job(void *job_entry)
 
 	FREE_NULL(job_record_point->nodes);
 	FREE_NULL_BITMAP(job_record_point->node_bitmap);
+	FREE_NULL(job_record_point->cpus_per_node);
+	FREE_NULL(job_record_point->cpu_count_reps);
 	FREE_NULL(job_record_point->node_addr);
 	if (job_record_point->step_list) {
 		delete_all_step_records(job_record_point);
diff --git a/src/slurmctld/read_config.c b/src/slurmctld/read_config.c
index fbd2a2afcab..b4390cb04d1 100644
--- a/src/slurmctld/read_config.c
+++ b/src/slurmctld/read_config.c
@@ -48,6 +48,11 @@
 #include "src/slurmctld/slurmctld.h"
 
 #define BUF_SIZE 1024
+#define FREE_NULL(_X)			\
+	do {				\
+		if (_X) xfree (_X);	\
+		_X	= NULL; 	\
+	} while (0)
 
 static int _build_bitmaps(void);
 static int _init_all_slurm_conf(void);
@@ -295,6 +300,7 @@ static int _parse_node_spec(char *in_line)
 			error_code = EINVAL;
 			goto cleanup;
 		}
+		FREE_NULL(state);
 	}
 
 	if (node_addr &&
@@ -339,6 +345,7 @@ static int _parse_node_spec(char *in_line)
 					xfree(default_config_record.
 					      feature);
 				default_config_record.feature = feature;
+				feature = NULL;
 			}
 			free(this_node_name);
 			break;
@@ -363,6 +370,7 @@ static int _parse_node_spec(char *in_line)
 				if (config_point->feature)
 					xfree(config_point->feature);
 				config_point->feature = feature;
+				feature = NULL;
 			}
 		}
 
@@ -405,14 +413,16 @@ static int _parse_node_spec(char *in_line)
 	}
 
 	/* xfree allocated storage */
-	if (state)
-		xfree(state);
+	if (node_addr)
+		xfree(node_addr);
 	if (addr_list)
 		hostlist_destroy(addr_list);
 	hostlist_destroy(host_list);
 	return error_code;
 
       cleanup:
+	if (node_addr)
+		xfree(node_addr);
 	if (node_name)
 		xfree(node_name);
 	if (feature)
@@ -487,8 +497,7 @@ static int _parse_part_spec(char *in_line)
 			error_code = EINVAL;
 			goto cleanup;
 		}
-		xfree(default_str);
-		default_str = NULL;
+		FREE_NULL(default_str);
 	}
 
 	if (root_str) {
@@ -503,8 +512,7 @@ static int _parse_part_spec(char *in_line)
 			error_code = EINVAL;
 			goto cleanup;
 		}
-		xfree(root_str);
-		root_str = NULL;
+		FREE_NULL(root_str);
 	}
 
 	if (shared_str) {
@@ -521,8 +529,7 @@ static int _parse_part_spec(char *in_line)
 			error_code = EINVAL;
 			goto cleanup;
 		}
-		xfree(shared_str);
-		shared_str = NULL;
+		FREE_NULL(shared_str);
 	}
 
 	if (state_str) {
@@ -537,8 +544,7 @@ static int _parse_part_spec(char *in_line)
 			error_code = EINVAL;
 			goto cleanup;
 		}
-		xfree(state_str);
-		state_str = NULL;
+		FREE_NULL(state_str);
 	}
 
 	if (strcasecmp(partition_name, "DEFAULT") == 0) {
@@ -557,11 +563,13 @@ static int _parse_part_spec(char *in_line)
 			if (default_part.allow_groups)
 				xfree(default_part.allow_groups);
 			default_part.allow_groups = allow_groups;
+			allow_groups = NULL;
 		}
 		if (nodes) {
 			if (default_part.nodes)
 				xfree(default_part.nodes);
 			default_part.nodes = nodes;
+			nodes = NULL;
 		}
 		return 0;
 	}
@@ -597,6 +605,7 @@ static int _parse_part_spec(char *in_line)
 		if (part_record_point->allow_groups)
 			xfree(part_record_point->allow_groups);
 		part_record_point->allow_groups = allow_groups;
+		allow_groups = NULL;
 	}
 	if (nodes) {
 		if (part_record_point->nodes)
@@ -609,6 +618,7 @@ static int _parse_part_spec(char *in_line)
 			getnodename(nodes, 128);
 		}
 		part_record_point->nodes = nodes;
+		nodes = NULL;
 	}
 	xfree(partition_name);
 	return 0;
-- 
GitLab