diff --git a/libtelnet.c b/libtelnet.c
index 95b40dc..09ffd8d 100644
--- a/libtelnet.c
+++ b/libtelnet.c
@@ -48,13 +48,7 @@
 #define Q_WANTYES_OP 5
 
 /* buffer sizes */
-static const size_t _buffer_sizes[] = {
-	0,
-	512,
-	2048,
-	8192,
-	16384,
-};
+static const size_t _buffer_sizes[] = { 0, 512, 2048, 8192, 16384, };
 static const size_t _buffer_sizes_count = sizeof(_buffer_sizes) /
 		sizeof(_buffer_sizes[0]);
 
@@ -416,12 +410,6 @@
  * must be aborted and reprocessed due to COMPRESS2 being activated
  */
 static int _subnegotiate(telnet_t *telnet) {
-	const char **argv; /* for ZMP */
-	char **argv2; /* for everything else */
-	const char *c;
-	const char *l;
-	size_t i, argc;
-
 	switch (telnet->sb_telopt) {
 #ifdef HAVE_ZLIB
 	/* received COMPRESS2 begin marker, setup our zlib box and
@@ -430,7 +418,7 @@
 	case TELNET_TELOPT_COMPRESS2:
 		if (telnet->sb_telopt == TELNET_TELOPT_COMPRESS2) {
 			if (_init_zlib(telnet, 0, 1) != TELNET_EOK)
-				break;
+				return 0;
 
 			/* standard SB notification */
 			_event(telnet, TELNET_EV_SUBNEGOTIATION, 0, telnet->sb_telopt,
@@ -440,11 +428,14 @@
 			_event(telnet, TELNET_EV_COMPRESS, 1, 0, 0, 0, 0, 0);
 			return 1;
 		}
-		break;
+		return 0;
 #endif /* HAVE_ZLIB */
 #ifdef HAVE_ALLOCA
+
 	/* ZMP command */
-	case TELNET_TELOPT_ZMP:
+	case TELNET_TELOPT_ZMP: {
+		const char **argv, *c;
+		size_t i, argc;
 		/* make sure this is a valid ZMP buffer */
 		if (telnet->buffer_pos == 0 ||
 				telnet->buffer[telnet->buffer_pos - 1] != 0) {
@@ -452,7 +443,7 @@
 					"incomplete ZMP frame");
 			_event(telnet, TELNET_EV_SUBNEGOTIATION, 0, telnet->sb_telopt,
 					telnet->buffer, telnet->buffer_pos, 0, 0);
-			break;
+			return 0;
 		}
 
 		/* count arguments */
@@ -466,7 +457,7 @@
 					"alloca() failed: %s", strerror(errno));
 			_event(telnet, TELNET_EV_SUBNEGOTIATION, 0, telnet->sb_telopt,
 					telnet->buffer, telnet->buffer_pos, 0, 0);
-			break;
+			return 0;
 		}
 
 		/* populate argument array */
@@ -478,19 +469,24 @@
 		/* invoke event with our arguments */
 		_event(telnet, TELNET_EV_SUBNEGOTIATION, 0, telnet->sb_telopt,
 				telnet->buffer, telnet->buffer_pos, argv, argc);
-		break;
+		return 0;
+	}
+
 	/* any of a number of commands that use the form <BYTE>data<BYTE>data,
 	 * including TTYPE, ENVIRON, NEW-ENVIRON, and MSSP
 	 */
 	case TELNET_TELOPT_TTYPE:
 	case TELNET_TELOPT_ENVIRON:
 	case TELNET_TELOPT_NEW_ENVIRON:
-	case TELNET_TELOPT_MSSP:
+	case TELNET_TELOPT_MSSP: {
+		char **argv, *c, *l;
+		size_t i, argc;
+
 		/* if we have no data, just pass it through */
 		if (telnet->buffer_pos == 0) {
 			_event(telnet, TELNET_EV_SUBNEGOTIATION, 0, telnet->sb_telopt,
 					telnet->buffer, telnet->buffer_pos, 0, 0);
-			break;
+			return 0;
 		}
 
 		/* very first byte must be in range 0-3 */
@@ -499,7 +495,7 @@
 					"telopt %d subneg has invalid data", telnet->sb_telopt);
 			_event(telnet, TELNET_EV_SUBNEGOTIATION, 0, telnet->sb_telopt,
 					telnet->buffer, telnet->buffer_pos, 0, 0);
-			break;
+			return 0;
 		}
 
 		/* count arguments; each argument is preceded by a byte in the
@@ -512,49 +508,52 @@
 				++argc;
 
 		/* allocate argument array, bail on error */
-		if ((argv2 = (char **)alloca(sizeof(char *) * argc)) == 0) {
+		if ((argv = (char **)alloca(sizeof(char *) * argc)) == 0) {
 			_error(telnet, __LINE__, __func__, TELNET_ENOMEM, 0,
 					"alloca() failed: %s", strerror(errno));
 			_event(telnet, TELNET_EV_SUBNEGOTIATION, 0, telnet->sb_telopt,
 					telnet->buffer, telnet->buffer_pos, 0, 0);
-			break;
+			return 0;
 		}
 
 		/* allocate strings in argument array */
 		for (i = 0, l = telnet->buffer; i != argc; ++i) {
+			/* search for end marker */
 			c = l + 1;
 			while (c != telnet->buffer + telnet->buffer_pos &&
 					(unsigned)*c > 3)
 				++c;
-			argv2[i] = (char *)alloca(c - l + 1);
-			l = c;
-			/* FIXME: check failure */
-		}
 
-		/* populate argument array */
-		for (i = 0, l = telnet->buffer; i != argc; ++i) {
-			c = l + 1;
-			while (c != telnet->buffer + telnet->buffer_pos &&
-					(unsigned)*c > 3)
-				++c;
-			memcpy(argv2[i], l, c - l);
-			argv2[i][c - l] = 0;
+			/* allocate space; bail on error */
+			if ((argv[i] = (char *)alloca(c - l + 1)) == 0) {
+				_error(telnet, __LINE__, __func__, TELNET_ENOMEM, 0,
+						"alloca() failed: %s", strerror(errno));
+				_event(telnet, TELNET_EV_SUBNEGOTIATION, 0, telnet->sb_telopt,
+						telnet->buffer, telnet->buffer_pos, 0, 0);
+				return 0;
+			}
+
+			/* copy data */
+			memcpy(argv[i], l, c - l);
+			argv[i][c - l] = 0;
+
+			/* prepare for next loop */
 			l = c;
 		}
 
 		/* invoke event with our arguments */
 		_event(telnet, TELNET_EV_SUBNEGOTIATION, 0, telnet->sb_telopt,
-				telnet->buffer, telnet->buffer_pos, (const char **)argv2, argc);
-		break;
+				telnet->buffer, telnet->buffer_pos, (const char **)argv, argc);
+		return 0;
+	}
 #endif /* HAVE_ALLOCA */
+
 	/* other generic subnegotiation */
 	default:
 		_event(telnet, TELNET_EV_SUBNEGOTIATION, 0, telnet->sb_telopt,
 				telnet->buffer, telnet->buffer_pos, 0, 0);
-		break;
+		return 0;
 	}
-
-	return 0;
 }
 
 /* initialize a telnet state tracker */
