diff --git a/src/common/hostlist.c b/src/common/hostlist.c
index 80e84d3145110ab9bc6fa9d7f20c0be8cbe0b06b..2a447a12a6efc5bdc917669c26159538a037360c 100644
--- a/src/common/hostlist.c
+++ b/src/common/hostlist.c
@@ -1210,6 +1210,8 @@ static size_t hostrange_numstr(hostrange_t hr, size_t n, char *buf)
 
 	if (hr->singlehost || n == 0)
 		return 0;
+	if (n <= dims)
+		return -1;
 
 	if ((dims > 1) && (hr->width == dims)) {
 		int i2 = 0;
@@ -1217,16 +1219,18 @@ static size_t hostrange_numstr(hostrange_t hr, size_t n, char *buf)
 
 		hostlist_parse_int_to_array(hr->lo, coord, dims, 0);
 
-		for (i2 = 0; i2 < dims; i2++) {
-			if (len <= n)
-				buf[len++] = alpha_num[coord[i2]];
-		}
+		while (i2 < dims)
+			buf[len++] = alpha_num[coord[i2++]];
 		buf[len] = '\0';
 	} else {
 		len = snprintf(buf, n, "%0*lu", hr->width, hr->lo);
+		if (len < 0 || len >= n)
+			return -1;
 	}
 
-	if ((len >= 0) && (len < n) && (hr->lo < hr->hi)) {
+	if (hr->lo < hr->hi) {
+		if (n < len + dims + 2)	/* '-' plus 'dims' digits, plus '\0' */
+			return -1;
 		if ((dims > 1) && (hr->width == dims)) {
 			int i2 = 0;
 			int coord[dims];
@@ -1234,18 +1238,14 @@ static size_t hostrange_numstr(hostrange_t hr, size_t n, char *buf)
 			hostlist_parse_int_to_array(hr->hi, coord, dims, 0);
 
 			buf[len++] = '-';
-			for (i2 = 0; i2 < dims; i2++) {
-				if (len <= n)
-					buf[len++] = alpha_num[coord[i2]];
-			}
+			while (i2 < dims)
+				buf[len++] = alpha_num[coord[i2++]];
 			buf[len] = '\0';
 		} else {
 			int len2 = snprintf(buf + len, n - len, "-%0*lu",
 					    hr->width, hr->hi);
-			if (len2 < 0)
-				len = -1;
-			else
-				len += len2;
+			if (len2 < 0 || (len += len2) >= n)
+				return -1;
 		}
 	}