Index: lib/ipmi_raw.c
===================================================================
RCS file: /cvsroot/ipmitool/ipmitool/lib/ipmi_raw.c,v
retrieving revision 1.23
diff -u -r1.23 ipmi_raw.c
--- lib/ipmi_raw.c	1 Jul 2008 00:11:42 -0000	1.23
+++ lib/ipmi_raw.c	14 Nov 2012 12:54:05 -0000
@@ -147,13 +147,25 @@
 		return 0;
 	}
 
-	i2cbus  =  (uint8_t)strtoul(argv[0], NULL, 0);
-	i2caddr =  (uint8_t)strtoul(argv[1], NULL, 0);
+	if (str2uchar(argv[0], &i2cbus) != 0) {
+		lprintf(LOG_ERR, "Given i2cbus \"%s\" is invalid.", argv[0]);
+		return (-1);
+	}
+	if (str2uchar(argv[1], &i2caddr) != 0) {
+		lprintf(LOG_ERR, "Given i2caddr \"%s\" is invalid.", argv[1]);
+		return (-1);
+	}
 	if( argc >= 3 ){
-		channel	= (uint8_t)strtoul(argv[2], NULL, 0);
+		if (str2uchar(argv[2], &channel) != 0) {
+			lprintf(LOG_ERR, "Given channel \"%s\" is invalid.", argv[2]);
+			return (-1);
+		}
 	}
 	if( argc >= 4 ){
-		msize	  =  (uint8_t)strtoul(argv[3], NULL, 0);
+		if (str2uchar(argv[3], &msize) != 0) {
+			lprintf(LOG_ERR, "Given maxread \"%s\" is invalid.", argv[3]);
+			return (-1);
+		}
 	}
 
 	i2cbus = ((channel & 0xF) << 4) | ((i2cbus & 7) << 1) | 1;
@@ -221,8 +233,14 @@
 		return -1;
 	}
 
-	i2caddr = (uint8_t)strtoul(argv[i++], NULL, 0);
-	rsize = (uint8_t)strtoul(argv[i++], NULL, 0);
+	if (str2uchar(argv[i++], &i2caddr) != 0) {
+		lprintf(LOG_ERR, "Given i2caddr \"%s\" is invalid.", argv[i++]);
+		return (-1);
+	}
+	if (str2uchar(argv[i++], &rsize) != 0) {
+		lprintf(LOG_ERR, "Given read size \"%s\" is invalid.", argv[i++]);
+		return (-1);
+	}
 
 	if (i2caddr == 0) {
 		lprintf(LOG_ERR, "Invalid I2C address 0");
@@ -232,7 +250,11 @@
 
 	memset(wdata, 0, IPMI_I2C_MASTER_MAX_SIZE);
 	for (; i < argc; i++) {
-		uint8_t val = (uint8_t)strtol(argv[i], NULL, 0);
+		uint8_t val = 0;
+		if (str2uchar(argv[i], &val) != 0) {
+			lprintf(LOG_ERR, "Given parameter \"%s\" is invalid.", argv[i]);
+			return (-1);
+		}
 		wdata[wsize] = val;
 		wsize++;
 	}
@@ -289,6 +311,7 @@
 	struct ipmi_rs * rsp;
 	struct ipmi_rq req;
 	uint8_t netfn, cmd, lun;
+	uint16_t netfn_tmp = 0;
 	int i;
 	uint8_t data[256];
 
@@ -308,12 +331,24 @@
 	ipmi_intf_session_set_retry(intf, 1);
 
 	lun = intf->target_lun;
-	netfn = str2val(argv[0], ipmi_netfn_vals);
-	if (netfn == 0xff) {
-		netfn = (uint8_t)strtol(argv[0], NULL, 0);
+	netfn_tmp = str2val(argv[0], ipmi_netfn_vals);
+	if (netfn_tmp == 0xff) {
+		if (str2uchar(argv[0], &netfn) != 0) {
+			lprintf(LOG_ERR, "Given netfn \"%s\" is invalid.", argv[0]);
+			return (-1);
+		}
+	} else {
+		if (netfn_tmp >= UINT8_MAX) {
+			lprintf(LOG_ERR, "Given netfn \"%s\" is out of range.", argv[0]);
+			return (-1);
+		}
+		netfn = netfn_tmp;
 	}
 
-	cmd = (uint8_t)strtol(argv[1], NULL, 0);
+	if (str2uchar(argv[1], &cmd) != 0) {
+		lprintf(LOG_ERR, "Given command \"%s\" is invalid.", argv[1]);
+		return (-1);
+	}
 
 	memset(data, 0, sizeof(data));
 	memset(&req, 0, sizeof(req));
@@ -323,7 +358,11 @@
 	req.msg.data = data;
 
 	for (i=2; i<argc; i++) {
-		uint8_t val = (uint8_t)strtol(argv[i], NULL, 0);
+		uint8_t val = 0;
+		if (str2uchar(argv[i], &val) != 0) {
+			lprintf(LOG_ERR, "Given data \"%s\" is invalid.", argv[i]);
+			return (-1);
+		}
 		req.msg.data[i-2] = val;
 		req.msg.data_len++;
 	}
