Author: pkelsey
Date: Mon Jul  6 01:42:12 2015
New Revision: 285188
URL: https://svnweb.freebsd.org/changeset/base/285188

Log:
  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

Modified:
  head/lib/libc/gen/sysctl.c

Modified: head/lib/libc/gen/sysctl.c
==============================================================================
--- head/lib/libc/gen/sysctl.c  Sun Jul  5 23:24:52 2015        (r285187)
+++ head/lib/libc/gen/sysctl.c  Mon Jul  6 01:42:12 2015        (r285188)
@@ -51,9 +51,21 @@ sysctl(const int *name, u_int namelen, v
     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, v
 
        switch (name[1]) {
        case USER_CS_PATH:
-               if (oldp && *oldlenp < sizeof(_PATH_STDPATH)) {
+               if (oldp && orig_oldlen < sizeof(_PATH_STDPATH)) {
                        errno = ENOMEM;
                        return -1;
                }
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to