From ba9bfbb6a486abfb56eb5a2595ca74aa951b96bd Mon Sep 17 00:00:00 2001
From: Moe Jette <jette1@llnl.gov>
Date: Thu, 20 Dec 2007 17:14:47 +0000
Subject: [PATCH] modify node and job state recovery logic for 32-bit string
 length field

---
 src/slurmctld/job_mgr.c  |  6 +++---
 src/slurmctld/node_mgr.c | 11 ++++++-----
 2 files changed, 9 insertions(+), 8 deletions(-)

diff --git a/src/slurmctld/job_mgr.c b/src/slurmctld/job_mgr.c
index 13403b20fe3..32f85b0161c 100644
--- a/src/slurmctld/job_mgr.c
+++ b/src/slurmctld/job_mgr.c
@@ -418,18 +418,18 @@ extern int load_all_job_state(void)
          * see if the header contains a "VERXXX" string, we need to make
          * sure that there is enough data in the buffer to compare against.
          */
-	if (size_buf(buffer) >= sizeof(uint16_t) + strlen(JOB_STATE_VERSION))
+	if (size_buf(buffer) >= sizeof(uint32_t) + strlen(JOB_STATE_VERSION))
 	{
 	        char *ptr = get_buf_data(buffer);
 
-	        if (memcmp(&ptr[sizeof(uint16_t)], JOB_STATE_VERSION, 3) == 0)
+	        if (memcmp(&ptr[sizeof(uint32_t)], JOB_STATE_VERSION, 3) == 0)
 		{
 		        safe_unpackstr_xmalloc(&ver_str, &ver_str_len, buffer);
 		        debug3("Version string in job_state header is %s",
 			       ver_str);
 		}
 	}
-	if (ver_str && (strcmp(ver_str, JOB_STATE_VERSION) != 0)) {
+	if ((!ver_str) || (strcmp(ver_str, JOB_STATE_VERSION) != 0)) {
 		error("***********************************************");
 		error("Can not recover job state, incompatable version");
 		error("***********************************************");
diff --git a/src/slurmctld/node_mgr.c b/src/slurmctld/node_mgr.c
index 13e044d912c..97c4600f09a 100644
--- a/src/slurmctld/node_mgr.c
+++ b/src/slurmctld/node_mgr.c
@@ -410,7 +410,6 @@ extern int load_all_node_state ( bool state_only )
 	time_t time_stamp, now = time(NULL);
 	Buf buffer;
 	char *ver_str = NULL;
-	uint32_t ver_str_len;
 
 	/* read the file */
 	state_file = xstrdup (slurmctld_conf.state_save_location);
@@ -451,17 +450,19 @@ extern int load_all_node_state ( bool state_only )
 	 * Check the data version so that when the format changes, we 
 	 * we don't try to unpack data using the wrong format routines
 	 */
-	if (size_buf(buffer) >= sizeof(uint16_t) + strlen(NODE_STATE_VERSION)) {
+	if (size_buf(buffer) >= sizeof(uint32_t) + strlen(NODE_STATE_VERSION)) {
 		char *ptr = get_buf_data(buffer);
 
-		if (memcmp( &ptr[sizeof(uint16_t)], NODE_STATE_VERSION, 3) == 0) {
-			safe_unpackstr_xmalloc( &ver_str, &ver_str_len, buffer);
+		if (memcmp( &ptr[sizeof(uint32_t)], NODE_STATE_VERSION, 3) == 0) {
+			safe_unpackstr_xmalloc( &ver_str, &name_len, buffer);
 			debug3("Version string in node_state header is %s",
 				ver_str);
 		}
 	}
-	if (ver_str && (strcmp(ver_str, NODE_STATE_VERSION) != 0)) {
+	if ((!ver_str) || (strcmp(ver_str, NODE_STATE_VERSION) != 0)) {
+		error("*****************************************************");
 		error("Can not recover node state, data version incompatable");
+		error("*****************************************************");
 		xfree(ver_str);
 		free_buf(buffer);
 		return EFAULT;
-- 
GitLab