diff --git a/src/scontrol/scontrol.h b/src/scontrol/scontrol.h
index 2d9de5d..e1fdcad 100644
--- a/src/scontrol/scontrol.h
+++ b/src/scontrol/scontrol.h
@@ -37,6 +37,7 @@
  *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301  USA.
 \*****************************************************************************/
 
+#define _ISOC99_SOURCE          /* for LLONG_{MIN,MAX} */
 #ifndef __SCONTROL_H__
 #define __SCONTROL_H__
 
@@ -52,6 +53,7 @@
 
 #include <ctype.h>
 #include <errno.h>
+#include <limits.h>
 #include <stdio.h>
 #include <stdlib.h>
 #ifdef HAVE_STRING_H
@@ -113,6 +115,9 @@ extern partition_info_msg_t *old_part_info_ptr;
 extern reserve_info_msg_t *old_res_info_ptr;
 extern slurm_ctl_conf_info_msg_t *old_slurm_ctl_conf_ptr;
 
+extern int	parse_uint16(char *aval, uint16_t *ival);
+extern int	parse_uint32(char *aval, uint32_t *ival);
+
 extern int	scontrol_checkpoint(char *op, char *job_step_id_str, int argc,
 				    char **argv);
 extern int	scontrol_create_part(int argc, char *argv[]);
diff --git a/src/scontrol/update_job.c b/src/scontrol/update_job.c
index 68b684f..722cb42 100644
--- a/src/scontrol/update_job.c
+++ b/src/scontrol/update_job.c
@@ -344,8 +344,77 @@ scontrol_requeue(char *job_id_str)
 	return rc;
 }
 
+/*
+ * parse_uint32 - Convert anscii string to a 32 bit unsigned int.
+ * IN      aval - ascii string.
+ * IN/OUT  ival - 32 bit pointer. 
+ * RET     0 if no error, 1 otherwise.
+ */
+extern int
+parse_uint32(char *aval, uint32_t *ival)
+{
+	/*
+	 * An unsigned 32 bit integer can have a maximum
+	 * value of 4294967295.
+	 *
+	 * First,  convert the ascii value it to a
+	 * long long int. If the result is greater
+	 * than or equal to 0 and less than 4294967295
+	 * set the value and return. Otherwise return
+	 * an error.
+	 */
+	uint32_t max32uint = 4294967295;
+	long long  tval;
+
+	/*
+ 	 * Return error for invalid value.
+	 */
+	tval = strtoll(aval, (char **) NULL, 10);
+	if (tval == LLONG_MIN || tval == LLONG_MAX ||
+	    tval < 0 || tval > max32uint) 
+		return 1;
+
+	*ival = (uint32_t) tval;
+
+	return 0;
+}
 
 /*
+ * parse_uint16 - Convert anscii string to a 16 bit unsigned int.
+ * IN      aval - ascii string.
+ * IN/OUT  ival - 16 bit pointer. 
+ * RET     0 if no error, 1 otherwise.
+ */
+extern int
+parse_uint16(char *aval, uint16_t *ival)
+{
+	/*
+	 * an unsigned 16 bit integer can have a maximum
+	 * value of 65535.
+	 *
+	 * First,  convert the ascii value it to a
+	 * long long int. If the result is greater
+	 * than or equal to 0 and less than 65535
+	 * set the value and return. Otherwise
+	 * return an error.
+	 */
+	long long  tval;
+	uint16_t max16uint = 65535;
+
+	/*
+ 	 * Return error for invalid value.
+	 */
+	tval = strtoll(aval, (char **) NULL, 10);
+	if (tval == LLONG_MIN || tval == LLONG_MAX ||
+	    tval < 0 || tval > max16uint) 
+		return 1;
+
+	*ival = (uint16_t) tval;
+
+	return 0;
+}
+	
+/*
  * scontrol_update_job - update the slurm job configuration per the supplied
  *	arguments
  * IN argc - count of arguments
@@ -386,10 +455,12 @@ scontrol_update_job (int argc, char *argv[])
 			fprintf (stderr, "Request aborted\n");
 			return -1;
 		}
-
 		if (strncasecmp(tag, "JobId", MAX(taglen, 3)) == 0) {
-			job_msg.job_id =
-				(uint32_t) strtol(val, (char **) NULL, 10);
+			if (parse_uint32(val, &job_msg.job_id)) {
+				printf("Invalid JobId value: %s\n", val);
+				exit_code = 1;
+				return 0;
+			}
 		}
 		else if (strncasecmp(tag, "Comment", MAX(taglen, 3)) == 0) {
 			job_msg.comment = val;
@@ -443,8 +514,11 @@ scontrol_update_job (int argc, char *argv[])
 			update_cnt++;
 		}
 		else if (strncasecmp(tag, "Priority", MAX(taglen, 2)) == 0) {
-			job_msg.priority =
-				(uint32_t) strtoll(val, (char **) NULL, 10);
+			if (parse_uint32(val, &job_msg.priority)) {
+				printf("Invalid Priority value: %s\n", val);
+				exit_code = 1;
+				return 0;
+			}
 			update_cnt++;
 		}
 		else if (strncasecmp(tag, "Nice", MAX(taglen, 2)) == 0) {
@@ -466,7 +540,7 @@ scontrol_update_job (int argc, char *argv[])
 						   &max_cpus, false) ||
 			    (min_cpus <= 0) ||
 			    (max_cpus && (max_cpus < min_cpus))) {
-				error("Invalid NumCPUs value: %s", val);
+				error("Invalid NumCPUs value: %s\n", val);
 				exit_code = 1;
 				return 0;
 			}
@@ -477,13 +551,19 @@ scontrol_update_job (int argc, char *argv[])
 		}
 		/* ReqProcs was removed in SLURM version 2.1 */
 		else if (strncasecmp(tag, "ReqProcs", MAX(taglen, 8)) == 0) {
-			job_msg.num_tasks =
-				(uint32_t) strtol(val, (char **) NULL, 10);
+			if (parse_uint32(val, &job_msg.num_tasks)) {
+				printf("Invalid ReqProcs value: %s\n", val);
+				exit_code = 1;
+				return 0;
+			}
 			update_cnt++;
 		}
 		else if (strncasecmp(tag, "Requeue", MAX(taglen, 4)) == 0) {
-			job_msg.requeue =
-				(uint16_t) strtol(val, (char **) NULL, 10);
+			if (parse_uint16(val, &job_msg.requeue)) {
+				printf("Invalid Requeue value: %s\n", val);
+				exit_code = 1;
+				return 0;
+			}
 			update_cnt++;
 		}
 		/* ReqNodes was replaced by NumNodes in SLURM version 2.1 */
@@ -509,47 +589,71 @@ scontrol_update_job (int argc, char *argv[])
 			update_cnt++;
 		}
 		else if (strncasecmp(tag, "ReqSockets", MAX(taglen, 4)) == 0) {
-			job_msg.sockets_per_node =
-				(uint16_t) strtol(val, (char **) NULL, 10);
+			if (parse_uint16(val, &job_msg.sockets_per_node)) {
+				printf("Invalid ReqSockets value: %s\n", val);
+				exit_code = 1;
+				return 0;
+			}
 			update_cnt++;
 		}
 		else if (strncasecmp(tag, "ReqCores", MAX(taglen, 4)) == 0) {
-			job_msg.cores_per_socket =
-				(uint16_t) strtol(val, (char **) NULL, 10);
+			if (parse_uint16(val, &job_msg.cores_per_socket)) {
+				printf("Invalid ReqCores value: %s\n", val);
+				exit_code = 1;
+				return 0;
+			}
 			update_cnt++;
 		}
                 else if (strncasecmp(tag, "TasksPerNode", MAX(taglen, 2))==0) {
-                        job_msg.ntasks_per_node =
-                                (uint16_t) strtol(val, (char **) NULL, 10);
+			if (parse_uint16(val, &job_msg.ntasks_per_node)) {
+				printf("Invalid TasksPerNode value: %s\n", val);
+				exit_code = 1;
+				return 0;
+			}
                         update_cnt++;
                 }
 		else if (strncasecmp(tag, "ReqThreads", MAX(taglen, 4)) == 0) {
-			job_msg.threads_per_core =
-				(uint16_t) strtol(val, (char **) NULL, 10);
+			if (parse_uint16(val, &job_msg.threads_per_core)) {
+				printf("Invalid ReqThreads value: %s\n", val);
+				exit_code = 1;
+				return 0;
+			}
 			update_cnt++;
 		}
 		else if (strncasecmp(tag, "MinCPUsNode", MAX(taglen, 4)) == 0) {
-			job_msg.pn_min_cpus =
-				(uint32_t) strtol(val, (char **) NULL, 10);
+			if (parse_uint16(val, &job_msg.pn_min_cpus)) {
+				printf("Invalid MinCPUsNode value: %s\n", val);
+				exit_code = 1;
+				return 0;
+			}
 			update_cnt++;
 		}
 		else if (strncasecmp(tag, "MinMemoryNode",
 				     MAX(taglen, 10)) == 0) {
-			job_msg.pn_min_memory =
-				(uint32_t) strtol(val, (char **) NULL, 10);
+			if (parse_uint32(val, &job_msg.pn_min_memory)) {
+				printf("Invalid MinMemoryNode value: %s\n", val);
+				exit_code = 1;
+				return 0;
+			}
 			update_cnt++;
 		}
 		else if (strncasecmp(tag, "MinMemoryCPU",
 				     MAX(taglen, 10)) == 0) {
-			job_msg.pn_min_memory =
-				(uint32_t) strtol(val, (char **) NULL, 10);
+			if (parse_uint32(val, &job_msg.pn_min_memory)) {
+				printf("Invalid MinMemoryCPU value: %s\n", val);
+				exit_code = 1;
+				return 0;
+			}
 			job_msg.pn_min_memory |= MEM_PER_CPU;
 			update_cnt++;
 		}
 		else if (strncasecmp(tag, "MinTmpDiskNode",
 				     MAX(taglen, 5)) == 0) {
-			job_msg.pn_min_tmp_disk =
-				(uint32_t) strtol(val, (char **) NULL, 10);
+			if (parse_uint32(val, &job_msg.pn_min_tmp_disk)) {
+				printf("Invalid MinTmpDiskNode value: %s\n", val);
+				exit_code = 1;
+				return 0;
+			}
 			update_cnt++;
 		}
 		else if (strncasecmp(tag, "Partition", MAX(taglen, 2)) == 0) {
@@ -585,8 +689,11 @@ scontrol_update_job (int argc, char *argv[])
 		}
 		else if (strncasecmp(tag, "wait-for-switch", MAX(taglen, 5))
 			 == 0) {
-			job_msg.wait4switch =
-				(uint32_t) strtol(val, (char **) NULL, 10);
+			if (parse_uint32(val, &job_msg.wait4switch)) {
+				printf("Invalid wait-for-switch value: %s\n", val);
+				exit_code = 1;
+				return 0;
+			}
 			update_cnt++;
 		}
 		else if (strncasecmp(tag, "Shared", MAX(taglen, 2)) == 0) {
@@ -594,10 +701,11 @@ scontrol_update_job (int argc, char *argv[])
 				job_msg.shared = 1;
 			else if (strncasecmp(val, "NO", MAX(vallen, 1)) == 0)
 				job_msg.shared = 0;
-			else
-				job_msg.shared =
-					(uint16_t) strtol(val,
-							(char **) NULL, 10);
+			else if (parse_uint16(val, &job_msg.shared)) {
+				printf("Invalid wait-for-switch value: %s\n", val);
+				exit_code = 1;
+				return 0;
+			}
 			update_cnt++;
 		}
 		else if (strncasecmp(tag, "Contiguous", MAX(taglen, 3)) == 0) {
@@ -605,10 +713,11 @@ scontrol_update_job (int argc, char *argv[])
 				job_msg.contiguous = 1;
 			else if (strncasecmp(val, "NO", MAX(vallen, 1)) == 0)
 				job_msg.contiguous = 0;
-			else
-				job_msg.contiguous =
-					(uint16_t) strtol(val,
-							(char **) NULL, 10);
+			else if (parse_uint16(val, &job_msg.contiguous)) {
+				printf("Invalid Contiguous value: %s\n", val);
+				exit_code = 1;
+				return 0;
+			}
 			update_cnt++;
 		}
 		else if (strncasecmp(tag, "ExcNodeList", MAX(taglen, 3)) == 0){
@@ -689,10 +798,11 @@ scontrol_update_job (int argc, char *argv[])
 				rotate = 1;
 			else if (strncasecmp(val, "NO", MAX(vallen, 1)) == 0)
 				rotate = 0;
-			else
-				rotate = (uint16_t) strtol(val,
-							   (char **) NULL, 10);
-			job_msg.rotate = rotate;
+			else if (parse_uint16(val, &job_msg.rotate)) {
+				printf("Invalid wait-for-switch value: %s\n", val);
+				exit_code = 1;
+				return 0;
+			}
 			update_cnt++;
 		}
 		else if (strncasecmp(tag, "Conn-Type", MAX(taglen, 2)) == 0) {
diff --git a/src/scontrol/update_part.c b/src/scontrol/update_part.c
index 88188ae..75ea112 100644
--- a/src/scontrol/update_part.c
+++ b/src/scontrol/update_part.c
@@ -226,8 +226,10 @@ scontrol_parse_part_options (int argc, char *argv[], int *update_cnt_ptr,
 			(*update_cnt_ptr)++;
 		}
 		else if (strncasecmp(tag, "Priority", MAX(taglen, 3)) == 0) {
-			part_msg_ptr->priority = (uint16_t) strtol(val,
-					(char **) NULL, 10);
+			if (parse_uint16(val, &part_msg_ptr->priority)) {
+				printf("Invalid Priority value: %s\n",val);
+				return -1;
+			}
 			(*update_cnt_ptr)++;
 		}
 		else if (strncasecmp(tag, "State", MAX(taglen, 2)) == 0) {
@@ -265,33 +267,44 @@ scontrol_parse_part_options (int argc, char *argv[], int *update_cnt_ptr,
 			(*update_cnt_ptr)++;
 		}
 		else if (strncasecmp(tag, "GraceTime", MAX(taglen, 5)) == 0) {
-			part_msg_ptr->grace_time = slurm_atoul(val);
+			if (parse_uint32(val, &part_msg_ptr->grace_time)) {
+				printf("Invalid GraceTime value: %s\n",val);
+				return -1;
+			}
 			(*update_cnt_ptr)++;
 		}
 		else if (strncasecmp(tag, "DefMemPerCPU",
 				     MAX(taglen, 10)) == 0) {
-			part_msg_ptr->def_mem_per_cpu = (uint32_t) strtol(val,
-							(char **) NULL, 10);
+			if (parse_uint32(val, &part_msg_ptr->def_mem_per_cpu)) {
+				printf("Invalid DefMemPerCPU value: %s\n",val);
+				return -1;
+			}
 			part_msg_ptr->def_mem_per_cpu |= MEM_PER_CPU;
 			(*update_cnt_ptr)++;
 		}
 		else if (strncasecmp(tag, "DefMemPerNode",
 				     MAX(taglen, 10)) == 0) {
-			part_msg_ptr->def_mem_per_cpu = (uint32_t) strtol(val,
-							(char **) NULL, 10);
+			if (parse_uint32(val, &part_msg_ptr->def_mem_per_cpu)) {
+				printf("Invalid DefMemPerNode value: %s\n",val);
+				return -1;
+			}
 			(*update_cnt_ptr)++;
 		}
 		else if (strncasecmp(tag, "MaxMemPerCPU",
 				     MAX(taglen, 10)) == 0) {
-			part_msg_ptr->max_mem_per_cpu = (uint32_t) strtol(val,
-							(char **) NULL, 10);
+			if (parse_uint32(val, &part_msg_ptr->max_mem_per_cpu)) {
+				printf("Invalid MaxMemPerCPU value: %s\n",val);
+				return -1;
+			}
 			part_msg_ptr->max_mem_per_cpu |= MEM_PER_CPU;
 			(*update_cnt_ptr)++;
 		}
 		else if (strncasecmp(tag, "MaxMemPerNode",
 				     MAX(taglen, 10)) == 0) {
-			part_msg_ptr->max_mem_per_cpu = (uint32_t) strtol(val,
-							(char **) NULL, 10);
+			if (parse_uint32(val, &part_msg_ptr->max_mem_per_cpu)) {
+				printf("Invalid MaxMemPerNode value: %s\n",val);
+				return -1;
+			}
 			(*update_cnt_ptr)++;
 		}
 		else {
