diff --git a/src/slurmctld/job_mgr.c b/src/slurmctld/job_mgr.c
index b266a9c519815fb02d9db0bd05dd87bfded5b9a9..edd984a8c15b3698d4b17e2e2f20c90b322ca461 100644
--- a/src/slurmctld/job_mgr.c
+++ b/src/slurmctld/job_mgr.c
@@ -3737,8 +3737,7 @@ extern int job_str_signal(char *job_id_str, uint16_t signal, uint16_t flags,
 	bitstr_t *array_bitmap, *tmp_bitmap;
 	bool valid = true;
 	int32_t i, i_first, i_last;
-	int rc = SLURM_SUCCESS, rc2;
-	int inx;
+	int rc = SLURM_SUCCESS, rc2, len;
 
 	/* Jobs submitted using Moab command should be cancelled using
 	 * Moab command for accurate job records */
@@ -3766,7 +3765,7 @@ extern int job_str_signal(char *job_id_str, uint16_t signal, uint16_t flags,
 		return ESLURM_INVALID_JOB_ID;
 	}
 	job_id = (uint32_t) long_id;
-	if (end_ptr[0] == '\0') {
+	if (end_ptr[0] == '\0') {	/* Single job (or full job array) */
 		job_ptr = find_job_array_rec(job_id, INFINITE);
 		if ((job_ptr->array_task_id == NO_VAL) &&
 		    (job_ptr->array_recs == NULL)) {
@@ -3775,8 +3774,7 @@ extern int job_str_signal(char *job_id_str, uint16_t signal, uint16_t flags,
 		}
 
 		/* Signal all tasks of this job array */
-		inx = JOB_HASH_INX(job_id);
-		job_ptr = job_array_hash_j[inx];
+		job_ptr = job_array_hash_j[JOB_HASH_INX(job_id)];
 		while (job_ptr) {
 			if (job_ptr->array_job_id == job_id) {
 				rc2 = _job_signal(job_ptr, signal, flags, uid,
@@ -3798,6 +3796,11 @@ extern int job_str_signal(char *job_id_str, uint16_t signal, uint16_t flags,
 		tok = strtok_r(NULL, ",", &end_ptr);
 	}
 	xfree(tmp);
+	if (valid) {
+		i_last = bit_fls(array_bitmap);
+		if (i_last < 0)
+			valid = false;
+	}
 	if (!valid) {
 		info("job_signal: invalid job id %s", job_id_str);
 		return ESLURM_INVALID_JOB_ID;
@@ -3806,16 +3809,11 @@ extern int job_str_signal(char *job_id_str, uint16_t signal, uint16_t flags,
 	/* Find some job record and validate the user cancelling the job */
 	job_ptr = find_job_record(job_id);
 	if (job_ptr == NULL) {
-		i_first = bit_ffs(array_bitmap);
-		if (i_first >= 0)
-			i_last = bit_fls(array_bitmap);
-		else
-			i_last = -2;
-		for (i = i_first; i <= i_last; i++) {
-			if (!bit_test(array_bitmap, i))
-				continue;
-			if ((job_ptr = find_job_array_rec(job_id, i)))
+		job_ptr = job_array_hash_j[JOB_HASH_INX(job_id)];
+		while (job_ptr) {
+			if (job_ptr->array_job_id == job_id)
 				break;
+			job_ptr = job_ptr->job_array_next_j;
 		}
 	}
 	if ((job_ptr == NULL) || (job_ptr->array_task_id == NO_VAL) ||
@@ -3841,10 +3839,17 @@ extern int job_str_signal(char *job_id_str, uint16_t signal, uint16_t flags,
 
 	if (IS_JOB_PENDING(job_ptr) &&
 	    job_ptr->array_recs && job_ptr->array_recs->task_id_bitmap) {
+		/* Ensure bitmap sizes match for AND operations */
+		len = bit_size(job_ptr->array_recs->task_id_bitmap);
+		i_last++;	/* last bit used in array_bitmap */
+		if (i_last < len)
+			bit_realloc(array_bitmap, len);
+		else if (i_last > len)
+			bit_realloc(job_ptr->array_recs->task_id_bitmap,i_last);
+
 		tmp_bitmap = bit_copy(job_ptr->array_recs->task_id_bitmap);
 		if (signal == SIGKILL) {
 			bit_not(array_bitmap);
-/* FIXME: bitmap sizes may differ */
 			bit_and(job_ptr->array_recs->task_id_bitmap,
 				array_bitmap);
 			xfree(job_ptr->array_recs->task_id_str);