diff --git a/src/common/gres.c b/src/common/gres.c
index 903f425e57e200b15383860f075fe40534a147ce..12e4dfeaefb868eb960615756c9020bb529ecea8 100644
--- a/src/common/gres.c
+++ b/src/common/gres.c
@@ -1904,7 +1904,7 @@ static int _job_config_validate(char *config, uint32_t *gres_cnt,
 			cnt *= (1024 * 1024);
 		else
 			return SLURM_ERROR;
-		if (cnt <= 0)
+		if (cnt < 0)
 			return SLURM_ERROR;
 	} else
 		return SLURM_ERROR;
@@ -1920,12 +1920,13 @@ static int _job_state_validate(char *config, void **gres_data,
 	uint32_t gres_cnt;
 
 	rc = _job_config_validate(config, &gres_cnt, context_ptr);
-	if (rc == SLURM_SUCCESS) {
+	if ((rc == SLURM_SUCCESS) && (gres_cnt > 0)) {
 		gres_job_state_t *gres_ptr;
 		gres_ptr = xmalloc(sizeof(gres_job_state_t));
 		gres_ptr->gres_cnt_alloc = gres_cnt;
 		*gres_data = gres_ptr;
-	}
+	} else
+		*gres_data = NULL;
 
 	return rc;
 }
@@ -1941,7 +1942,7 @@ extern int gres_plugin_job_state_validate(char *req_config, List *gres_list)
 	char *tmp_str, *tok, *last = NULL;
 	int i, rc, rc2;
 	gres_state_t *gres_ptr;
-	void *gres_data;
+	void *job_gres_data;
 
 	if ((req_config == NULL) || (req_config[0] == '\0')) {
 		*gres_list = NULL;
@@ -1953,23 +1954,22 @@ extern int gres_plugin_job_state_validate(char *req_config, List *gres_list)
 
 	slurm_mutex_lock(&gres_context_lock);
 	tmp_str = xstrdup(req_config);
-	if ((gres_context_cnt > 0) && (*gres_list == NULL)) {
-		*gres_list = list_create(_gres_job_list_delete);
-		if (*gres_list == NULL)
-			fatal("list_create malloc failure");
-	}
-
 	tok = strtok_r(tmp_str, ",", &last);
 	while (tok && (rc == SLURM_SUCCESS)) {
 		rc2 = SLURM_ERROR;
 		for (i=0; i<gres_context_cnt; i++) {
-			rc2 = _job_state_validate(tok, &gres_data,
+			rc2 = _job_state_validate(tok, &job_gres_data,
 						  &gres_context[i]);
-			if (rc2 != SLURM_SUCCESS)
+			if ((rc2 != SLURM_SUCCESS) || (job_gres_data == NULL))
 				continue;
+			if (*gres_list == NULL) {
+				*gres_list = list_create(_gres_job_list_delete);
+				if (*gres_list == NULL)
+					fatal("list_create malloc failure");
+			}
 			gres_ptr = xmalloc(sizeof(gres_state_t));
 			gres_ptr->plugin_id = gres_context[i].plugin_id;
-			gres_ptr->gres_data = gres_data;
+			gres_ptr->gres_data = job_gres_data;
 			list_append(*gres_list, gres_ptr);
 			break;		/* processed it */
 		}
@@ -2001,8 +2001,8 @@ static void *_job_state_dup(void *gres_data)
 	new_gres_ptr->node_cnt		= gres_ptr->node_cnt;
 
 	if (gres_ptr->gres_bit_alloc) {
-		new_gres_ptr->gres_bit_alloc	= xmalloc(sizeof(bitstr_t *) *
-							  gres_ptr->node_cnt);
+		new_gres_ptr->gres_bit_alloc = xmalloc(sizeof(bitstr_t *) *
+						       gres_ptr->node_cnt);
 		for (i=0; i<gres_ptr->node_cnt; i++) {
 			if (gres_ptr->gres_bit_alloc[i] == NULL)
 				continue;
@@ -2066,6 +2066,8 @@ List gres_plugin_job_state_extract(List gres_list, int node_index)
 
 	slurm_mutex_lock(&gres_context_lock);
 	gres_iter = list_iterator_create(gres_list);
+	if (gres_iter == NULL)
+		fatal("list_iterator_create: malloc failure");
 	while ((gres_ptr = (gres_state_t *) list_next(gres_iter))) {
 		if (node_index == -1)
 			new_gres_data = _job_state_dup(gres_ptr->gres_data);
@@ -2999,12 +3001,13 @@ static int _step_state_validate(char *config, void **gres_data,
 	uint32_t gres_cnt;
 
 	rc = _job_config_validate(config, &gres_cnt, context_ptr);
-	if (rc == SLURM_SUCCESS) {
+	if ((rc == SLURM_SUCCESS) && (gres_cnt > 0)) {
 		gres_step_state_t *gres_ptr;
 		gres_ptr = xmalloc(sizeof(gres_step_state_t));
 		gres_ptr->gres_cnt_alloc = gres_cnt;
 		*gres_data = gres_ptr;
-	}
+	} else
+		*gres_data = NULL;
 
 	return rc;
 }
@@ -3100,34 +3103,31 @@ extern int gres_plugin_step_state_validate(char *req_config,
 	*step_gres_list = NULL;
 	if ((req_config == NULL) || (req_config[0] == '\0'))
 		return SLURM_SUCCESS;
-	if (job_gres_list == NULL) {
-		info("step %u.%u has gres spec, while job has none",
-		     job_id, step_id);
-		return ESLURM_INVALID_GRES;
-	}
 
 	if ((rc = gres_plugin_init()) != SLURM_SUCCESS)
 		return rc;
 
 	slurm_mutex_lock(&gres_context_lock);
 	tmp_str = xstrdup(req_config);
-	if ((gres_context_cnt > 0) && (*step_gres_list == NULL)) {
-		*step_gres_list = list_create(_gres_step_list_delete);
-		if (*step_gres_list == NULL)
-			fatal("list_create malloc failure");
-	}
-
 	tok = strtok_r(tmp_str, ",", &last);
 	while (tok && (rc == SLURM_SUCCESS)) {
 		rc2 = SLURM_ERROR;
 		for (i=0; i<gres_context_cnt; i++) {
 			rc2 = _step_state_validate(tok, &step_gres_data,
 						   &gres_context[i]);
-			if (rc2 != SLURM_SUCCESS)
+			if ((rc2 != SLURM_SUCCESS) || (step_gres_data == NULL))
 				continue;
+			if (job_gres_list == NULL) {
+				info("step %u.%u has gres spec, job has none",
+				     job_id, step_id);
+				rc2 = ESLURM_INVALID_GRES;
+				continue;
+			}
 			/* Now make sure the step's request isn't too big for
 			 * the job's gres allocation */
 			job_gres_iter = list_iterator_create(job_gres_list);
+			if (job_gres_iter == NULL)
+				fatal("list_iterator_create: malloc failure");
 			while ((job_gres_ptr = (gres_state_t *)
 					list_next(job_gres_iter))) {
 				if (job_gres_ptr->plugin_id ==
@@ -3154,6 +3154,12 @@ extern int gres_plugin_step_state_validate(char *req_config,
 				break;
 			}
 
+			if (*step_gres_list == NULL) {
+				*step_gres_list = list_create(
+						  _gres_step_list_delete);
+				if (*step_gres_list == NULL)
+					fatal("list_create malloc failure");
+			}
 			step_gres_ptr = xmalloc(sizeof(gres_state_t));
 			step_gres_ptr->plugin_id = gres_context[i].plugin_id;
 			step_gres_ptr->gres_data = step_gres_data;