diff --git a/NEWS b/NEWS
index def65eae7eab5bd17e7884646d89f0645a1e173b..da25ff463b4d94f4bfde619cee3ce9c0046b54fe 100644
--- a/NEWS
+++ b/NEWS
@@ -140,6 +140,8 @@ documents those changes that are of interest to users and admins.
     Didier Gazen, Laboratoire d'Aerologie.
  -- BLUEGENE - fix for not allowing jobs if all midplanes are drained and all
     blocks are in an error state.
+ -- Avoid slurmctld abort due to bad pointer when setting an advanced
+    reservation MAINT flag if it contains no nodes (only licenses).
 
 * Changes in SLURM 2.3.3
 ========================
diff --git a/src/slurmctld/reservation.c b/src/slurmctld/reservation.c
index 008fef19e006297a94e187560882a7e35e484f6b..0ce8579bd275b9a53af8455e0ac9da7f3f329aaf 100644
--- a/src/slurmctld/reservation.c
+++ b/src/slurmctld/reservation.c
@@ -3356,11 +3356,17 @@ static void _set_nodes_maint(slurmctld_resv_t *resv_ptr, time_t now)
 	struct node_record *node_ptr;
 
 	if (!resv_ptr->node_bitmap) {
-		error("reservation %s lacks a bitmap", resv_ptr->name);
+		error("maintenance reservation %s lacks a bitmap",
+		      resv_ptr->name);
 		return;
 	}
 
 	i_first = bit_ffs(resv_ptr->node_bitmap);
+	if (i_first < 0) {
+		error("maintenance reservation %s includes no nodes",
+		      resv_ptr->name);
+		return;
+	}
 	i_last  = bit_fls(resv_ptr->node_bitmap);
 	for (i=i_first; i<=i_last; i++) {
 		if (!bit_test(resv_ptr->node_bitmap, i))