From ebcbf29eb7a377eb63be136529e4618b10346773 Mon Sep 17 00:00:00 2001
From: Moe Jette <jette1@llnl.gov>
Date: Tue, 15 Jan 2008 16:51:05 +0000
Subject: [PATCH] Support job, node and partition names of arbitrary size.

---
 NEWS                                          |  1 +
 src/plugins/jobcomp/filetxt/jobcomp_filetxt.c |  2 +-
 src/plugins/sched/wiki/job_modify.c           |  4 +-
 src/plugins/sched/wiki2/job_modify.c          | 14 ++--
 src/slurmctld/job_mgr.c                       | 64 +++++++++++--------
 src/slurmctld/node_mgr.c                      | 25 +++++---
 src/slurmctld/partition_mgr.c                 | 39 ++++++-----
 src/slurmctld/read_config.c                   | 28 ++++----
 src/slurmctld/slurmctld.h                     | 13 ++--
 9 files changed, 105 insertions(+), 85 deletions(-)

diff --git a/NEWS b/NEWS
index 301ad9c3eb4..855f762189f 100644
--- a/NEWS
+++ b/NEWS
@@ -27,6 +27,7 @@ documents those changes that are of interest to users and admins.
     SelectTypeParameter=CR_Memory in slurm.conf.
  -- BLUEGENE: Reorganized bluegene plugin for maintainability sake.
  -- Major restructuring of data structures in select/cons_res.
+ -- Support job, node and partition names of arbitrary size.
 
 * Changes in SLURM 1.3.0-pre7
 =============================
diff --git a/src/plugins/jobcomp/filetxt/jobcomp_filetxt.c b/src/plugins/jobcomp/filetxt/jobcomp_filetxt.c
index b9415f2d5fb..7b033e7e8fd 100644
--- a/src/plugins/jobcomp/filetxt/jobcomp_filetxt.c
+++ b/src/plugins/jobcomp/filetxt/jobcomp_filetxt.c
@@ -222,7 +222,7 @@ extern int slurm_jobcomp_set_location ( char * location )
 extern int slurm_jobcomp_log_record ( struct job_record *job_ptr )
 {
 	int rc = SLURM_SUCCESS;
-	char job_rec[512+MAX_JOBNAME_LEN];
+	char job_rec[1024];
 	char usr_str[32], grp_str[32], start_str[32], end_str[32], lim_str[32];
 	char select_buf[128];
 	size_t offset = 0, tot_size, wrote;
diff --git a/src/plugins/sched/wiki/job_modify.c b/src/plugins/sched/wiki/job_modify.c
index 72030e90aea..35486df2561 100644
--- a/src/plugins/sched/wiki/job_modify.c
+++ b/src/plugins/sched/wiki/job_modify.c
@@ -165,11 +165,11 @@ host_fini:	if (rc) {
 		}
 		info("wiki: change job %u partition %s",
 			jobid, part_name_ptr);
-		strncpy(job_ptr->partition, part_name_ptr, MAX_SLURM_NAME);
+		xfree(job_ptr->partition);
+		job_ptr->partition = xstrdup(part_name_ptr);
 		job_ptr->part_ptr = part_ptr;
 		last_job_update = time(NULL);
 	}
-
 	if (new_node_cnt) {
 		if (IS_JOB_PENDING(job_ptr) && job_ptr->details) {
 			job_ptr->details->min_nodes = new_node_cnt;
diff --git a/src/plugins/sched/wiki2/job_modify.c b/src/plugins/sched/wiki2/job_modify.c
index ac7b2218a8a..25e1b1aaf86 100644
--- a/src/plugins/sched/wiki2/job_modify.c
+++ b/src/plugins/sched/wiki2/job_modify.c
@@ -122,7 +122,8 @@ static int	_job_modify(uint32_t jobid, char *bank_ptr,
 
 	if (name_ptr) {
 		info("wiki: change job %u name %s", jobid, name_ptr);
-		strncpy(job_ptr->name, name_ptr, sizeof(job_ptr->name));
+		xfree(job_ptr->name);
+		job_ptr->name = xstrdup(name_ptr);
 		last_job_update = now;
 	}
 
@@ -192,7 +193,8 @@ host_fini:	if (rc) {
 		}
 		info("wiki: change job %u partition %s",
 			jobid, part_name_ptr);
-		strncpy(job_ptr->partition, part_name_ptr, MAX_SLURM_NAME);
+		xfree(job_ptr->partition);
+		job_ptr->partition = xstrdup(part_name_ptr);
 		job_ptr->part_ptr = part_ptr;
 		last_job_update = now;
 	}
@@ -278,7 +280,7 @@ extern int	job_modify_wiki(char *cmd_ptr, int *err_code, char **err_msg)
 		name_ptr += 8;
 		if (name_ptr[0] == '\"') {
 			name_ptr++;
-			for (i=0; i<MAX_JOBNAME_LEN; i++) {
+			for (i=0; ; i++) {
 				if (name_ptr[i] == '\0')
 					break;
 				if (name_ptr[i] == '\"') {
@@ -286,11 +288,9 @@ extern int	job_modify_wiki(char *cmd_ptr, int *err_code, char **err_msg)
 					break;
 				}
 			}
-			if (i == MAX_JOBNAME_LEN)
-				name_ptr[i-1] = '\0';
 		} else if (name_ptr[0] == '\'') {
 			name_ptr++;
-			for (i=0; i<MAX_JOBNAME_LEN; i++) {
+			for (i=0; ; i++) {
 				if (name_ptr[i] == '\0')
 					break;
 				if (name_ptr[i] == '\'') {
@@ -298,8 +298,6 @@ extern int	job_modify_wiki(char *cmd_ptr, int *err_code, char **err_msg)
 					break;
 				}
 			}
-			if (i == MAX_JOBNAME_LEN)
-				name_ptr[i-1] = '\0';
 		} else
 			null_term(name_ptr);
 	}
diff --git a/src/slurmctld/job_mgr.c b/src/slurmctld/job_mgr.c
index ebfd4e1a48f..e9b8abd4e7a 100644
--- a/src/slurmctld/job_mgr.c
+++ b/src/slurmctld/job_mgr.c
@@ -666,8 +666,8 @@ static int _load_job_state(Buf buffer)
 	job_ptr->total_procs  = total_procs;
 	job_ptr->db_index     = db_index;
 	job_ptr->time_last_active = time(NULL);
-	strncpy(job_ptr->name, name, MAX_JOBNAME_LEN);
-	xfree(name);
+	job_ptr->name = name;
+	name          = NULL;	/* reused, nothing left to free */
 	xfree(job_ptr->nodes);
 	job_ptr->nodes  = nodes;
 	nodes           = NULL;	/* reused, nothing left to free */
@@ -679,8 +679,8 @@ static int _load_job_state(Buf buffer)
 	xfree(job_ptr->alloc_node);
 	job_ptr->alloc_node = alloc_node;
 	alloc_node          = NULL;	/* reused, nothing left to free */
-	strncpy(job_ptr->partition, partition, MAX_SLURM_NAME);
-	xfree(partition);
+	job_ptr->partition = partition;
+	partition          = NULL;	/* reused, nothing left to free */
 	job_ptr->account = account;
 	account          = NULL;  /* reused, nothing left to free */
 	job_ptr->comment = comment;
@@ -2028,27 +2028,27 @@ static int _validate_job_create_req(job_desc_msg_t * job_desc)
 {
 	if (job_desc->account && (strlen(job_desc->account) > MAX_STR_LEN)) {
 		info("_validate_job_create_req: strlen(account) too big (%d)",
-		     strlen(job_desc->features));
+		     strlen(job_desc->account));
 		return ESLURM_PATHNAME_TOO_LONG;
 	}
 	if (job_desc->alloc_node && (strlen(job_desc->alloc_node) > MAX_STR_LEN)) {
 		info("_validate_job_create_req: strlen(alloc_node) too big (%d)",
-		     strlen(job_desc->features));
-		return ESLURM_PATHNAME_TOO_LONG;
-	}
-	if (job_desc->comment && (strlen(job_desc->comment) > MAX_STR_LEN)) {
-		info("_validate_job_create_req: strlen(comment) too big (%d)",
-		     strlen(job_desc->features));
+		     strlen(job_desc->alloc_node));
 		return ESLURM_PATHNAME_TOO_LONG;
 	}
 	if (job_desc->blrtsimage && (strlen(job_desc->blrtsimage) > MAX_STR_LEN)) {
 		info("_validate_job_create_req: strlen(blrtsimage) too big (%d)",
-		     strlen(job_desc->features));
+		     strlen(job_desc->blrtsimage));
+		return ESLURM_PATHNAME_TOO_LONG;
+	}
+	if (job_desc->comment && (strlen(job_desc->comment) > MAX_STR_LEN)) {
+		info("_validate_job_create_req: strlen(comment) too big (%d)",
+		     strlen(job_desc->comment));
 		return ESLURM_PATHNAME_TOO_LONG;
 	}
 	if (job_desc->dependency && (strlen(job_desc->dependency) > MAX_STR_LEN)) {
 		info("_validate_job_create_req: strlen(dependency) too big (%d)",
-		     strlen(job_desc->features));
+		     strlen(job_desc->dependency));
 		return ESLURM_PATHNAME_TOO_LONG;
 	}
 	if (job_desc->err && (strlen(job_desc->err) > MAX_STR_LEN)) {
@@ -2068,12 +2068,12 @@ static int _validate_job_create_req(job_desc_msg_t * job_desc)
 	}
 	if (job_desc->linuximage && (strlen(job_desc->linuximage) > MAX_STR_LEN)) {
 		info("_validate_job_create_req: strlen(linuximage) too big (%d)",
-		     strlen(job_desc->features));
+		     strlen(job_desc->linuximage));
 		return ESLURM_PATHNAME_TOO_LONG;
 	}
 	if (job_desc->mail_user && (strlen(job_desc->mail_user) > MAX_STR_LEN)) {
 		info("_validate_job_create_req: strlen(mail_user) too big (%d)",
-		     strlen(job_desc->in));
+		     strlen(job_desc->mail_user));
 		return ESLURM_PATHNAME_TOO_LONG;
 	}
 	if (job_desc->mloaderimage && (strlen(job_desc->mloaderimage) > MAX_STR_LEN)) {
@@ -2081,9 +2081,14 @@ static int _validate_job_create_req(job_desc_msg_t * job_desc)
 		     strlen(job_desc->features));
 		return ESLURM_PATHNAME_TOO_LONG;
 	}
+	if (job_desc->name && (strlen(job_desc->name) > MAX_STR_LEN)) {
+		info("_validate_job_create_req: strlen(name) too big (%d)",
+		     strlen(job_desc->name));
+		return ESLURM_PATHNAME_TOO_LONG;
+	}
 	if (job_desc->network && (strlen(job_desc->network) > MAX_STR_LEN)) {
 		info("_validate_job_create_req: strlen(network) too big (%d)",
-		     strlen(job_desc->features));
+		     strlen(job_desc->network));
 		return ESLURM_PATHNAME_TOO_LONG;
 	}
 	if (job_desc->out && (strlen(job_desc->out) > MAX_STR_LEN)) {
@@ -2091,9 +2096,14 @@ static int _validate_job_create_req(job_desc_msg_t * job_desc)
 		     strlen(job_desc->out));
 		return ESLURM_PATHNAME_TOO_LONG;
 	}
+	if (job_desc->partition && (strlen(job_desc->partition) > MAX_STR_LEN)) {
+		info("_validate_job_create_req: strlen(partition) too big (%d)",
+		     strlen(job_desc->partition));
+		return ESLURM_PATHNAME_TOO_LONG;
+	}
 	if (job_desc->ramdiskimage && (strlen(job_desc->ramdiskimage) > MAX_STR_LEN)) {
 		info("_validate_job_create_req: strlen(ramdiskimage) too big (%d)",
-		     strlen(job_desc->features));
+		     strlen(job_desc->ramdiskimage));
 		return ESLURM_PATHNAME_TOO_LONG;
 	}
 	if (job_desc->work_dir && (strlen(job_desc->work_dir) > MAX_STR_LEN)) {
@@ -2493,7 +2503,7 @@ _copy_job_desc_to_job_record(job_desc_msg_t * job_desc,
 	if (error_code)
 		return error_code;
 
-	strncpy(job_ptr->partition, part_ptr->name, MAX_SLURM_NAME);
+	job_ptr->partition = xstrdup(part_ptr->name);
 	job_ptr->part_ptr = part_ptr;
 	if (job_desc->job_id != NO_VAL)		/* already confirmed unique */
 		job_ptr->job_id = job_desc->job_id;
@@ -2501,9 +2511,8 @@ _copy_job_desc_to_job_record(job_desc_msg_t * job_desc,
 		_set_job_id(job_ptr);
 	_add_job_hash(job_ptr);
 
-	if (job_desc->name) {
-		strncpy(job_ptr->name, job_desc->name, MAX_JOBNAME_LEN);
-	}
+	if (job_desc->name)
+		job_ptr->name = xstrdup(job_desc->name);
 	job_ptr->user_id    = (uid_t) job_desc->user_id;
 	job_ptr->group_id   = (gid_t) job_desc->group_id;
 	job_ptr->job_state  = JOB_PENDING;
@@ -2735,10 +2744,6 @@ static int _validate_job_desc(job_desc_msg_t * job_desc_msg, int allocate,
 		debug("_validate_job_desc: job failed to specify group");
 		job_desc_msg->group_id = 0;	/* uses user default */
 	}
-	if ((job_desc_msg->name) &&
-	    (strlen(job_desc_msg->name) >= MAX_JOBNAME_LEN)) {
-		job_desc_msg->name[MAX_JOBNAME_LEN-1] = '\0';
-	}
 	if (job_desc_msg->contiguous == (uint16_t) NO_VAL)
 		job_desc_msg->contiguous = 0;
 
@@ -2846,9 +2851,11 @@ static void _list_delete_job(void *job_entry)
 
 	delete_job_details(job_ptr);
 	xfree(job_ptr->alloc_node);
+	xfree(job_ptr->name);
 	xfree(job_ptr->nodes);
 	xfree(job_ptr->nodes_completing);
 	FREE_NULL_BITMAP(job_ptr->node_bitmap);
+	xfree(job_ptr->partition);
 	xfree(job_ptr->cpus_per_node);
 	xfree(job_ptr->cpu_count_reps);
 	xfree(job_ptr->node_addr);
@@ -3776,7 +3783,8 @@ int update_job(job_desc_msg_t * job_specs, uid_t uid)
 	}
 
 	if (job_specs->name) {
-		strncpy(job_ptr->name, job_specs->name, MAX_JOBNAME_LEN);
+		xfree(job_ptr->name);
+		job_ptr->name = xstrdup(job_specs->name);
 		info("update_job: setting name to %s for job_id %u",
 		     job_specs->name, job_specs->job_id);
 	}
@@ -3788,8 +3796,8 @@ int update_job(job_desc_msg_t * job_specs, uid_t uid)
 		else if (tmp_part_ptr == NULL)
 			error_code = ESLURM_INVALID_PARTITION_NAME;
 		else if (super_user) {
-			strncpy(job_ptr->partition, job_specs->partition,
-				MAX_SLURM_NAME);
+			xfree(job_ptr->partition);
+			job_ptr->partition = xstrdup(job_specs->partition);
 			job_ptr->part_ptr = tmp_part_ptr;
 			info("update_job: setting partition to %s for "
 			     "job_id %u", job_specs->partition, 
diff --git a/src/slurmctld/node_mgr.c b/src/slurmctld/node_mgr.c
index 799becfe0fb..c7a94e4e2a8 100644
--- a/src/slurmctld/node_mgr.c
+++ b/src/slurmctld/node_mgr.c
@@ -186,7 +186,6 @@ create_node_record (struct config_record *config_ptr, char *node_name)
 	last_node_update = time (NULL);
 	xassert(config_ptr);
 	xassert(node_name); 
-	xassert(strlen (node_name) < MAX_SLURM_NAME);
 
 	/* round up the buffer size to reduce overhead of xrealloc */
 	old_buffer_size = (node_record_count) * sizeof (struct node_record);
@@ -202,7 +201,7 @@ create_node_record (struct config_record *config_ptr, char *node_name)
 	else if (old_buffer_size != new_buffer_size)
 		xrealloc (node_record_table_ptr, new_buffer_size);
 	node_ptr = node_record_table_ptr + (node_record_count++);
-	strcpy (node_ptr->name, node_name);
+	node_ptr->name = xstrdup(node_name);
 	node_ptr->last_response = (time_t)0;
 	node_ptr->config_ptr = config_ptr;
 	node_ptr->part_cnt = 0;
@@ -648,6 +647,8 @@ int init_node_conf (void)
 	int i;
 
 	for (i=0; i<node_record_count; i++) {
+		xfree(node_record_table_ptr[i].name);
+		xfree(node_record_table_ptr[i].comm_name);
 		xfree(node_record_table_ptr[i].features);
 		xfree(node_record_table_ptr[i].reason);
 	}
@@ -838,6 +839,9 @@ extern void pack_all_node (char **buffer_ptr, int *buffer_size,
 		if (((show_flags & SHOW_ALL) == 0)
 		&&  (_node_is_hidden(node_ptr)))
 			continue;
+		if ((node_ptr->name == NULL) ||
+		    (node_ptr->name[0] == '\0'))
+			continue;
 
 		_pack_node(node_ptr, cr_flag, buffer);
 		nodes_packed ++ ;
@@ -924,17 +928,19 @@ static void _pack_node (struct node_record *dump_node_ptr, bool cr_flag,
 void rehash_node (void) 
 {
 	int i, inx;
+	struct node_record *node_ptr = node_record_table_ptr;
 
 	xfree (node_hash_table);
 	node_hash_table = xmalloc (sizeof (struct node_record *) * 
 				node_record_count);
 
-	for (i = 0; i < node_record_count; i++) {
-		if (strlen (node_record_table_ptr[i].name) == 0)
+	for (i = 0; i < node_record_count; i++, node_ptr++) {
+		if ((node_ptr->name == NULL) ||
+		    (node_ptr->name[0] == '\0'))
 			continue;	/* vestigial record */
-		inx = _hash_index (node_record_table_ptr[i].name);
-		node_record_table_ptr[i].node_next = node_hash_table[inx];
-		node_hash_table[inx] = &node_record_table_ptr[i];
+		inx = _hash_index (node_ptr->name);
+		node_ptr->node_next = node_hash_table[inx];
+		node_hash_table[inx] = node_ptr;
 	}
 
 #if _DEBUG
@@ -957,7 +963,8 @@ void set_slurmd_addr (void)
 
 	START_TIMER;
 	for (i = 0; i < node_record_count; i++, node_ptr++) {
-		if (node_ptr->name[0] == '\0')
+		if ((node_ptr->name == NULL) ||
+		    (node_ptr->name[0] == '\0'))
 			continue;
 		if (node_ptr->port == 0)
 			node_ptr->port = slurmctld_conf.slurmd_port;
@@ -2274,6 +2281,8 @@ void node_fini(void)
 	}
 
 	for (i=0; i< node_record_count; i++) {
+		xfree(node_record_table_ptr[i].name);
+		xfree(node_record_table_ptr[i].comm_name);
 		xfree(node_record_table_ptr[i].part_pptr);
 		xfree(node_record_table_ptr[i].features);
 		xfree(node_record_table_ptr[i].reason);
diff --git a/src/slurmctld/partition_mgr.c b/src/slurmctld/partition_mgr.c
index 373f1f1634a..f1054f4ec85 100644
--- a/src/slurmctld/partition_mgr.c
+++ b/src/slurmctld/partition_mgr.c
@@ -71,7 +71,7 @@
 /* Global variables */
 struct part_record default_part;	/* default configuration values */
 List part_list = NULL;			/* partition list */
-char default_part_name[MAX_SLURM_NAME];	/* name of default partition */
+char *default_part_name = NULL;		/* name of default partition */
 struct part_record *default_part_loc = NULL; /* default partition location */
 time_t last_part_update;	/* time of last update to partition records */
 
@@ -217,7 +217,7 @@ struct part_record *create_part_record(void)
 	    (struct part_record *) xmalloc(sizeof(struct part_record));
 
 	xassert (part_ptr->magic = PART_MAGIC);  /* set value */
-	strcpy(part_ptr->name, "DEFAULT");
+	part_ptr->name         = xstrdup("DEFAULT");
 	part_ptr->hidden       = default_part.hidden;
 	part_ptr->max_time     = default_part.max_time;
 	part_ptr->max_nodes    = default_part.max_nodes;
@@ -493,7 +493,8 @@ int load_all_part_state(void)
 			part_ptr->max_nodes = max_nodes;
 			part_ptr->min_nodes = min_nodes;
 			if (def_part_flag) {
-				strncpy(default_part_name, part_name, MAX_SLURM_NAME);
+				xfree(default_part_name);
+				default_part_name = xstrdup(part_name);
 				default_part_loc = part_ptr;
 			}
 			part_ptr->root_only = root_only;
@@ -547,7 +548,7 @@ int init_part_conf(void)
 {
 	last_part_update = time(NULL);
 
-	strcpy(default_part.name, "DEFAULT");
+	default_part.name        = xstrdup("DEFAULT");
 	default_part.hidden      = 0;
 	default_part.max_time    = INFINITE;
 	default_part.max_nodes   = INFINITE;
@@ -571,7 +572,7 @@ int init_part_conf(void)
 	if (part_list == NULL)
 		fatal ("memory allocation failure");
 
-	strcpy(default_part_name, "");
+	xfree(default_part_name);
 	default_part_loc = (struct part_record *) NULL;
 
 	return 0;
@@ -603,6 +604,7 @@ static void _list_delete_part(void *part_entry)
 			break;
 		}
 	}
+	xfree(part_ptr->name);
 	xfree(part_ptr->allow_groups);
 	xfree(part_ptr->allow_uids);
 	xfree(part_ptr->nodes);
@@ -623,8 +625,7 @@ int list_find_part(void *part_entry, void *key)
 	if (strcmp(key, "universal_key") == 0)
 		return 1;
 
-	if (strncmp(((struct part_record *) part_entry)->name,
-		    (char *) key, MAX_SLURM_NAME) == 0)
+	if (strcmp(((struct part_record *)part_entry)->name, (char *) key) == 0)
 		return 1;
 
 	return 0;
@@ -784,10 +785,8 @@ int update_part(update_part_msg_t * part_desc)
 	int error_code;
 	struct part_record *part_ptr;
 
-	if ((part_desc->name == NULL) ||
-	    (strlen(part_desc->name) >= MAX_SLURM_NAME)) {
-		error("update_part: invalid partition name  %s",
-		      part_desc->name);
+	if (part_desc->name == NULL) {
+		error("update_part: invalid partition name, NULL");
 		return ESLURM_INVALID_PARTITION_NAME;
 	}
 
@@ -799,7 +798,7 @@ int update_part(update_part_msg_t * part_desc)
 		info("update_part: partition %s does not exist, "
 			"being created", part_desc->name);
 		part_ptr = create_part_record();
-		strcpy(part_ptr->name, part_desc->name);
+		part_ptr->name = xstrdup(part_desc->name);
 	}
 
 	last_part_update = time(NULL);
@@ -863,11 +862,16 @@ int update_part(update_part_msg_t * part_desc)
 		part_ptr->priority = part_desc->priority;
 	}
 
-	if ((part_desc->default_part == 1) &&
-	    (strcmp(default_part_name, part_desc->name) != 0)) {
-		info("update_part: changing default partition from %s to %s", 
-		     default_part_name, part_desc->name);
-		strncpy(default_part_name, part_desc->name, MAX_SLURM_NAME);
+	if (part_desc->default_part == 1) {
+		if (default_part_name == NULL) {
+			info("update_part: setting default partition to %s", 
+			     part_desc->name);
+		} else if (strcmp(default_part_name, part_desc->name) != 0) {
+			info("update_part: changing default partition from %s to %s", 
+			     default_part_name, part_desc->name);
+		}
+		xfree(default_part_name);
+		default_part_name = xstrdup(part_desc->name);
 		default_part_loc = part_ptr;
 	}
 
@@ -1120,6 +1124,7 @@ void part_fini (void)
 		list_destroy(part_list);
 		part_list = NULL;
 	}
+	xfree(default_part_name);
 	default_part_loc = (struct part_record *) NULL;
 }
 
diff --git a/src/slurmctld/read_config.c b/src/slurmctld/read_config.c
index b84d1bb7c06..346b62925eb 100644
--- a/src/slurmctld/read_config.c
+++ b/src/slurmctld/read_config.c
@@ -97,7 +97,7 @@ static int  _sync_nodes_to_active_job(struct job_record *job_ptr);
 static void _validate_node_proc_count(void);
 #endif
 
-static char highest_node_name[MAX_SLURM_NAME] = "";
+static char *highest_node_name = NULL;
 int node_record_count = 0;
 
 /* FIXME - declarations for temporarily moved functions */
@@ -281,7 +281,7 @@ static int _init_all_slurm_conf(void)
 	if ((error_code = init_job_conf()))
 		return error_code;
 
-	strcpy(highest_node_name, "");
+	xfree(highest_node_name);
 	return 0;
 }
 
@@ -420,14 +420,16 @@ static int _build_single_nodeline_info(slurm_conf_node_t *node_ptr,
 		hostname = hostlist_shift(hostname_list);
 		address = hostlist_shift(address_list);
 #endif		
-		if (strcmp(alias, highest_node_name) <= 0) {
+		if (highest_node_name &&
+		    (strcmp(alias, highest_node_name) <= 0)) {
 			/* find_node_record locks this to get the
 			   alias so we need to unlock */
 			slurm_conf_unlock();
 			node_rec = find_node_record(alias);
 			slurm_conf_lock();			
 		} else {
-			strncpy(highest_node_name, alias, MAX_SLURM_NAME);
+			xfree(highest_node_name);
+			highest_node_name = xstrdup(alias);
 			node_rec = NULL;
 		}
 
@@ -437,7 +439,7 @@ static int _build_single_nodeline_info(slurm_conf_node_t *node_ptr,
 			    (state_val != NODE_STATE_UNKNOWN))
 				node_rec->node_state = state_val;
 			node_rec->last_response = (time_t) 0;
-			strncpy(node_rec->comm_name, address, MAX_SLURM_NAME);
+			node_rec->comm_name = xstrdup(address);
 
 			node_rec->port = node_ptr->port;
 			node_rec->reason = xstrdup(node_ptr->reason);
@@ -565,6 +567,7 @@ static int _build_all_nodeline_info(slurm_ctl_conf_t *conf)
 
 		_build_single_nodeline_info(node, config_ptr, conf);
 	}
+	xfree(highest_node_name);
 	return SLURM_SUCCESS;
 }
 
@@ -580,28 +583,23 @@ static int _build_single_partitionline_info(slurm_conf_partition_t *part)
 {
 	struct part_record *part_ptr;
 
-	if (strlen(part->name) >= MAX_SLURM_NAME) {
-		error("_parse_part_spec: partition name %s too long",
-		      part->name);
-		return EINVAL;
-	}
-
 	part_ptr = list_find_first(part_list, &list_find_part, part->name);
 	if (part_ptr == NULL) {
 		part_ptr = create_part_record();
-		strcpy(part_ptr->name, part->name);
+		part_ptr->name = xstrdup(part->name);
 	} else {
 		verbose("_parse_part_spec: duplicate entry for partition %s",
 			part->name);
 	}
 
 	if (part->default_flag) {
-		if ((strlen(default_part_name) > 0)
+		if (default_part_name
 		&&  strcmp(default_part_name, part->name))
 			info("_parse_part_spec: changing default partition "
 				"from %s to %s", 
 				default_part_name, part->name);
-		strcpy(default_part_name, part->name);
+		xfree(default_part_name);
+		default_part_name = xstrdup(part->name);
 		default_part_loc = part_ptr;
 	}
 	part_ptr->hidden    = part->hidden_flag ? 1 : 0;
@@ -870,6 +868,8 @@ static void _purge_old_node_state(struct node_record *old_node_table_ptr,
 	int i;
 
 	for (i = 0; i < old_node_record_count; i++) {
+		xfree(old_node_table_ptr[i].name);
+		xfree(old_node_table_ptr[i].comm_name);
 		xfree(old_node_table_ptr[i].part_pptr);
 		xfree(old_node_table_ptr[i].features);
 		xfree(old_node_table_ptr[i].reason);
diff --git a/src/slurmctld/slurmctld.h b/src/slurmctld/slurmctld.h
index 8326995d207..920e51b7f76 100644
--- a/src/slurmctld/slurmctld.h
+++ b/src/slurmctld/slurmctld.h
@@ -164,7 +164,6 @@ extern int bg_recover;		/* state recovery mode */
 /*****************************************************************************\
  *  NODE parameters and data structures
 \*****************************************************************************/
-#define MAX_JOBNAME_LEN 256
 #define CONFIG_MAGIC 0xc065eded
 #define NODE_MAGIC   0x0de575ed
 
@@ -187,7 +186,7 @@ extern List config_list;	/* list of config_record entries */
 
 struct node_record {
 	uint32_t magic;			/* magic cookie for data integrity */
-	char name[MAX_SLURM_NAME];	/* name of the node. NULL==defunct */
+	char *name;			/* name of the node. NULL==defunct */
 	uint16_t node_state;		/* enum node_states, ORed with 
 					 * NODE_STATE_NO_RESPOND if not 
 					 * responding */
@@ -203,7 +202,7 @@ struct node_record {
 	uint16_t part_cnt;		/* number of associated partitions */
 	struct part_record **part_pptr;	/* array of pointers to partitions 
 					 * associated with this node*/
-	char comm_name[MAX_SLURM_NAME];	/* communications path name to node */
+	char *comm_name;		/* communications path name to node */
 	uint16_t port;			/* TCP port number of the slurmd */
 	slurm_addr slurm_addr;		/* network address */
 	uint16_t comp_job_cnt;		/* count of jobs completing on node */
@@ -235,7 +234,7 @@ extern bitstr_t *up_node_bitmap;	/* bitmap of up nodes, not DOWN */
 
 struct part_record {
 	uint32_t magic;		/* magic cookie to test data integrity */
-	char name[MAX_SLURM_NAME];/* name of the partition */
+	char *name;		/* name of the partition */
 	uint16_t hidden;	/* 1 if hidden by default */
 	uint32_t max_time;	/* minutes or INFINITE */
 	uint32_t max_nodes;	/* per job or INFINITE */
@@ -259,7 +258,7 @@ struct part_record {
 extern List part_list;			/* list of part_record entries */
 extern time_t last_part_update;		/* time of last part_list update */
 extern struct part_record default_part;	/* default configuration values */
-extern char default_part_name[MAX_SLURM_NAME];	/* name of default partition */
+extern char *default_part_name;		/* name of default partition */
 extern struct part_record *default_part_loc;	/* default partition ptr */
 
 /*****************************************************************************\
@@ -335,8 +334,8 @@ struct job_details {
 struct job_record {
 	uint32_t job_id;		/* job ID */
 	uint32_t magic;			/* magic cookie for data integrity */
-	char name[MAX_JOBNAME_LEN];	/* name of the job */
-	char partition[MAX_SLURM_NAME];	/* name of the partition */
+	char *name;			/* name of the job */
+	char *partition;		/* name of the partition */
 	struct part_record *part_ptr;	/* pointer to the partition record */
 	uint16_t batch_flag;		/* 1 or 2 if batch job (with script),
 					 * 2 indicates retry mode (one retry) */
-- 
GitLab