Index: lib/helper.c
===================================================================
RCS file: /cvsroot/ipmitool/ipmitool/lib/helper.c,v
retrieving revision 1.49
diff -u -r1.49 helper.c
--- lib/helper.c	18 May 2013 06:08:13 -0000	1.49
+++ lib/helper.c	19 Jun 2013 03:51:10 -0000
@@ -693,3 +693,34 @@
 			argv_ptr);
 	return (-1);
 } /* is_fru_id(...) */
+
+/* is_ipmi_channel_num - wrapper for str-2-int Channel conversion. Message is
+ * printed on error.
+ *
+ * 6.3 Channel Numbers, p. 45, IPMIv2 spec.
+ * Valid channel numbers are: <0..7>, <E-F>
+ * Reserved channel numbers: <8-D>
+ *
+ * @argv_ptr: source string to convert from; usually argv
+ * @channel_ptr: pointer where to store result
+ *
+ * returns zero on success
+ * returns (-1) on error and message is printed on STDERR
+ */
+int
+is_ipmi_channel_num(const char *argv_ptr, uint8_t *channel_ptr)
+{
+	if (!argv_ptr || !channel_ptr) {
+		lprintf(LOG_ERR,
+				"is_ipmi_channel_num(): invalid argument(s).");
+		return (-1);
+	}
+	if ((str2uchar(argv_ptr, channel_ptr) == 0)
+			&& ((*channel_ptr >= 0x0 && *channel_ptr <= 0x7)
+				|| (*channel_ptr >= 0xE && *channel_ptr <= 0xF))) {
+		return 0;
+	}
+	lprintf(LOG_ERR, "Given Channel number '%s' is out of range.", argv_ptr);
+	lprintf(LOG_ERR, "Channel number must be from ranges: <0..7>, <0xE..0xF>");
+	return (-1);
+}
Index: lib/ipmi_firewall.c
===================================================================
RCS file: /cvsroot/ipmitool/ipmitool/lib/ipmi_firewall.c,v
retrieving revision 1.6
diff -u -r1.6 ipmi_firewall.c
--- lib/ipmi_firewall.c	29 Mar 2013 14:40:21 -0000	1.6
+++ lib/ipmi_firewall.c	19 Jun 2013 03:51:10 -0000
@@ -82,36 +82,58 @@
 ipmi_firewall_parse_args(int argc, char ** argv, struct ipmi_function_params * p)
 {
 	int i;
+	uint8_t conv_err = 0;
 
 	if (!p) {
 		lprintf(LOG_ERR, "ipmi_firewall_parse_args: p is NULL");
 		return -1;
 	}
 	for (i=0; i<argc; i++) {
-		if (strncmp(argv[i], "channel", 7) == 0) {
-			if (++i < argc)
-				p->channel = strtol(argv[i], NULL, 0);
+		if (strncmp(argv[i], "channel", 7) == 0 && (++i < argc)) {
+			uint8_t channel_tmp = 0;
+			if (is_ipmi_channel_num(argv[i], &channel_tmp) != 0) {
+				lprintf(LOG_ERR, "Given channel '%s' is invalid.", argv[i]);
+				conv_err = 1;
+				break;
+			} else {
+				p->channel = channel_tmp;
+			}
 		}
-		else if (strncmp(argv[i], "lun", 3) == 0) {
-			if (++i < argc)
-				p->lun = strtol(argv[i], NULL, 0);
+		else if (strncmp(argv[i], "lun", 3) == 0 && (++i < argc)) {
+			if (str2int(argv[i], &(p->lun)) != 0) {
+				lprintf(LOG_ERR, "Given lun '%s' is invalid.", argv[i]);
+				conv_err = 1;
+				break;
+			}
 		}
 		else if (strncmp(argv[i], "force", 5) == 0) {
 			p->force = 1;
 		}
-		else if (strncmp(argv[i], "netfn", 5) == 0) {
-			if (++i < argc)
-				p->netfn = strtol(argv[i], NULL, 0);
+		else if (strncmp(argv[i], "netfn", 5) == 0 && (++i < argc)) {
+			if (str2int(argv[i], &(p->netfn)) != 0) {
+				lprintf(LOG_ERR, "Given netfn '%s' is invalid.", argv[i]);
+				conv_err = 1;
+				break;
+			}
 		}
-		else if (strncmp(argv[i], "command", 7) == 0) {
-			if (++i < argc)
-				p->command = strtol(argv[i], NULL, 0);
+		else if (strncmp(argv[i], "command", 7) == 0 && (++i < argc)) {
+			if (str2int(argv[i], &(p->command)) != 0) {
+				lprintf(LOG_ERR, "Given command '%s' is invalid.", argv[i]);
+				conv_err = 1;
+				break;
+			}
 		}
-		else if (strncmp(argv[i], "subfn", 5) == 0) {
-			if (++i < argc)
-				p->subfn = strtol(argv[i], NULL, 0);
+		else if (strncmp(argv[i], "subfn", 5) == 0 && (++i < argc)) {
+			if (str2int(argv[i], &(p->subfn)) != 0) {
+				lprintf(LOG_ERR, "Given subfn '%s' is invalid.", argv[i]);
+				conv_err = 1;
+				break;
+			}
 		}
 	}
+	if (conv_err != 0) {
+		return (-1);
+	}
 	if (p->subfn >= MAX_SUBFN) {
 		printf("subfn is out of range (0-%d)\n", MAX_SUBFN-1);
 		return -1;
