svn commit: r290505 - in head/sys: kern sys

Bruce Evans brde at optusnet.com.au
Sat Nov 7 19:14:55 UTC 2015


On Sat, 7 Nov 2015, Conrad E. Meyer wrote:

> Log:
>  Flesh out sysctl types further (follow-up of r290475)
>
>  Use the right intmax_t type instead of intptr_t in a few remaining
>  places.
>
>  Add support for CTLFLAG_TUN for the new fixed with types.  Bruce will be
>  upset that the new handlers silently truncate tuned quad-sized inputs,
>  but so do all of the existing handlers.

I think I have complained about the getenv_*() integer functions before.
All of them truncate or otherwise corrupt the value.  getenv_quad()
does non-blind clamping using strtoq() followed by blind scaling in
the suffix case.  All others use getenv_quad() with blind truncation,
except on 64-bit arches long == quad so getenv_long() only has the same
errors as getenv_quad().

> Modified: head/sys/kern/kern_sysctl.c
> ==============================================================================
> --- head/sys/kern/kern_sysctl.c	Sat Nov  7 18:26:02 2015	(r290504)
> +++ head/sys/kern/kern_sysctl.c	Sat Nov  7 18:26:32 2015	(r290505)
> ...
> +	case CTLTYPE_S32:
> +		if (getenv_long(path + rem, &val_long) == 0)
> +			return;
> +		val_32 = val_long;
> +		req.newlen = sizeof(val_32);
> +		req.newptr = &val_32;
> +		break;

This should use getenv_int().  FreeBSD never supported 16-bit ints, and
POSIX now requires >= 32-bit ints.

> @@ -250,6 +274,27 @@ sysctl_load_tunable_by_oid_locked(struct
> 		req.newlen = sizeof(val_64);
> 		req.newptr = &val_64;
> 		break;
> +	case CTLTYPE_U8:
> +		if (getenv_uint(path + rem, (unsigned int *)&val_int) == 0)
> +			return;
> +		val_8 = val_int;
> +		req.newlen = sizeof(val_8);
> +		req.newptr = &val_8;
> +		break;
> +	case CTLTYPE_U16:
> +		if (getenv_uint(path + rem, (unsigned int *)&val_int) == 0)
> +			return;
> +		val_16 = val_int;
> +		req.newlen = sizeof(val_16);
> +		req.newptr = &val_16;
> +		break;

These could use getenv_int() since int is larger than int17_t.  Will null
error checking, there would be little difference for the overflows caused
by negative values.  With non-null error checking, the checking would be
slightly different.

> +	case CTLTYPE_U32:
> +		if (getenv_ulong(path + rem, (unsigned long *)&val_long) == 0)
> +			return;
> +		val_32 = val_long;
> +		req.newlen = sizeof(val_32);
> +		req.newptr = &val_32;
> +		break;

Like for S32.

Bruce


More information about the svn-src-head mailing list