Fix sysctl(3) so it returns the intended values for all mib names in

the 'user' sysctl tree, which have all been coming back 0 or empty
since r240176.

Differential Revision: https://reviews.freebsd.org/D2945
Reviewed by: sbruno
Approved by: jmallett (mentor)
MFC after: 3 days
This commit is contained in:
Patrick Kelsey 2015-07-06 01:42:12 +00:00
parent 363f89481b
commit 4959a176f8
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=285188

View File

@ -51,9 +51,21 @@ sysctl(const int *name, u_int namelen, void *oldp, size_t *oldlenp,
const void *newp, size_t newlen)
{
int retval;
size_t orig_oldlen;
orig_oldlen = oldlenp ? *oldlenp : 0;
retval = __sysctl(name, namelen, oldp, oldlenp, newp, newlen);
if (retval != -1 || errno != ENOENT || name[0] != CTL_USER)
/*
* All valid names under CTL_USER have a dummy entry in the sysctl
* tree (to support name lookups and enumerations) with an
* empty/zero value, and the true value is supplied by this routine.
* For all such names, __sysctl() is used solely to validate the
* name.
*
* Return here unless there was a successful lookup for a CTL_USER
* name.
*/
if (retval || name[0] != CTL_USER)
return (retval);
if (newp != NULL) {
@ -67,7 +79,7 @@ sysctl(const int *name, u_int namelen, void *oldp, size_t *oldlenp,
switch (name[1]) {
case USER_CS_PATH:
if (oldp && *oldlenp < sizeof(_PATH_STDPATH)) {
if (oldp && orig_oldlen < sizeof(_PATH_STDPATH)) {
errno = ENOMEM;
return -1;
}