svn commit: r272144 - head/sbin/sysctl

Mateusz Guzik mjguzik at gmail.com
Thu Sep 25 22:40:45 UTC 2014


On Thu, Sep 25, 2014 at 10:37:28PM +0000, Xin LI wrote:
> Author: delphij
> Date: Thu Sep 25 22:37:27 2014
> New Revision: 272144
> URL: http://svnweb.freebsd.org/changeset/base/272144
> 
> Log:
>   The strtol(3) family of functions would set errno when it hits one.
>   Check errno and handle it as invalid input.
>   

But this requires explicitely setting errno to 0 before strto* call,
otherwise you cannot know whether errno is meaningful when you test it.

Also it looks like the code would use some deduplications with macros or
something.


>   Obtained from:	HardenedBSD
>   Submitted by:	David CARLIER <devnexen at gmail.com>
>   MFC after:	2 weeks
> 
> Modified:
>   head/sbin/sysctl/sysctl.c
> 
> Modified: head/sbin/sysctl/sysctl.c
> ==============================================================================
> --- head/sbin/sysctl/sysctl.c	Thu Sep 25 22:22:57 2014	(r272143)
> +++ head/sbin/sysctl/sysctl.c	Thu Sep 25 22:37:27 2014	(r272144)
> @@ -305,7 +305,8 @@ parse(const char *string, int lineno)
>   				} else {
>  					intval = (int)strtol(newval, &endptr,
>  					    0);
> -					if (endptr == newval || *endptr != '\0') {
> +					if (errno != 0 || endptr == newval ||
> +						*endptr != '\0') {
>  						warnx("invalid integer '%s'%s",
>  						    (char *)newval, line);
>  						return (1);
> @@ -316,7 +317,8 @@ parse(const char *string, int lineno)
>  				break;
>  			case CTLTYPE_UINT:
>  				uintval = (int) strtoul(newval, &endptr, 0);
> -				if (endptr == newval || *endptr != '\0') {
> +				if (errno != 0 || endptr == newval ||
> +					*endptr != '\0') {
>  					warnx("invalid unsigned integer '%s'%s",
>  					    (char *)newval, line);
>  					return (1);
> @@ -326,7 +328,8 @@ parse(const char *string, int lineno)
>  				break;
>  			case CTLTYPE_LONG:
>  				longval = strtol(newval, &endptr, 0);
> -				if (endptr == newval || *endptr != '\0') {
> +				if (errno != 0 || endptr == newval ||
> +					*endptr != '\0') {
>  					warnx("invalid long integer '%s'%s",
>  					    (char *)newval, line);
>  					return (1);
> @@ -336,7 +339,8 @@ parse(const char *string, int lineno)
>  				break;
>  			case CTLTYPE_ULONG:
>  				ulongval = strtoul(newval, &endptr, 0);
> -				if (endptr == newval || *endptr != '\0') {
> +				if (errno != 0 || endptr == newval ||
> +					*endptr != '\0') {
>  					warnx("invalid unsigned long integer"
>  					    " '%s'%s", (char *)newval, line);
>  					return (1);
> @@ -348,7 +352,8 @@ parse(const char *string, int lineno)
>  				break;
>  			case CTLTYPE_S64:
>  				i64val = strtoimax(newval, &endptr, 0);
> -				if (endptr == newval || *endptr != '\0') {
> +				if (errno != 0 || endptr == newval ||
> +					*endptr != '\0') {
>  					warnx("invalid int64_t '%s'%s",
>  					    (char *)newval, line);
>  					return (1);
> @@ -358,7 +363,8 @@ parse(const char *string, int lineno)
>  				break;
>  			case CTLTYPE_U64:
>  				u64val = strtoumax(newval, &endptr, 0);
> -				if (endptr == newval || *endptr != '\0') {
> +				if (errno != 0 || endptr == newval ||
> +					*endptr != '\0') {
>  					warnx("invalid uint64_t '%s'%s",
>  					    (char *)newval, line);
>  					return (1);
> @@ -669,14 +675,16 @@ set_IK(const char *str, int *val)
>  	p = &str[len - 1];
>  	if (*p == 'C' || *p == 'F') {
>  		temp = strtof(str, &endptr);
> -		if (endptr == str || endptr != p)
> +		if (errno != 0 || endptr == str ||
> +			endptr != p)
>  			return (0);
>  		if (*p == 'F')
>  			temp = (temp - 32) * 5 / 9;
>  		kelv = temp * 10 + 2732;
>  	} else {
>  		kelv = (int)strtol(str, &endptr, 10);
> -		if (endptr == str || *endptr != '\0')
> +		if (errno != 0 || endptr == str ||
> +			*endptr != '\0')
>  			return (0);
>  	}
>  	*val = kelv;
> 

-- 
Mateusz Guzik <mjguzik gmail.com>


More information about the svn-src-head mailing list