svn commit: r367280 - head/lib/libc/gen

Stefan Eßer se at FreeBSD.org
Mon Nov 2 18:48:07 UTC 2020


Author: se
Date: Mon Nov  2 18:48:06 2020
New Revision: 367280
URL: https://svnweb.freebsd.org/changeset/base/367280

Log:
  Re-arrange some of the code to separate writable user tree variables from
  R/O variables.
  
  While here fix some nearby style. No functional change intended.
  
  MFC after:	1 month

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

Modified: head/lib/libc/gen/sysctl.c
==============================================================================
--- head/lib/libc/gen/sysctl.c	Mon Nov  2 18:45:43 2020	(r367279)
+++ head/lib/libc/gen/sysctl.c	Mon Nov  2 18:48:06 2020	(r367280)
@@ -53,26 +53,42 @@ sysctl(const int *name, u_int namelen, void *oldp, siz
 	int retval;
 	size_t orig_oldlen;
 
-	orig_oldlen = oldlenp ? *oldlenp : 0;
+	orig_oldlen = oldlenp != NULL ? *oldlenp : 0;
 	retval = __sysctl(name, namelen, oldp, oldlenp, newp, newlen);
 	/*
-	 * 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.
+	 * Valid names under CTL_USER except USER_LOCALBASE 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.
+	 * Return here unless there was a successful lookup for a CTL_USER name.
 	 */
-	if (retval || name[0] != CTL_USER)
+	if (retval != 0 || name[0] != CTL_USER)
 		return (retval);
 
 	if (namelen != 2) {
 		errno = EINVAL;
 		return (-1);
 	}
-	if (newp != NULL && name[1] != USER_LOCALBASE) {
+
+	/* Variables under CLT_USER that may be overridden by kernel values */
+	switch (name[1]) {
+	case USER_LOCALBASE:
+		if (oldlenp == NULL || *oldlenp != 1)
+			return (0);
+		if (oldp != NULL) {
+			if (orig_oldlen < sizeof(_PATH_LOCALBASE)) {
+				errno = ENOMEM;
+				return (-1);
+			}
+			memmove(oldp, _PATH_LOCALBASE, sizeof(_PATH_LOCALBASE));
+		}
+		*oldlenp = sizeof(_PATH_LOCALBASE);
+		return (0);
+	}
+
+	/* Variables under CLT_USER whose values are immutably defined below */
+	if (newp != NULL) {
 		errno = EPERM;
 		return (-1);
 	}
@@ -87,26 +103,9 @@ sysctl(const int *name, u_int namelen, void *oldp, siz
 		if (oldp != NULL)
 			memmove(oldp, _PATH_STDPATH, sizeof(_PATH_STDPATH));
 		return (0);
-	case USER_LOCALBASE:
-		if (oldlenp != NULL) {
-			if (oldp == NULL) {
-				if (*oldlenp == 1)
-					*oldlenp = sizeof(_PATH_LOCALBASE);
-			} else {
-				if (*oldlenp != 1)
-					return (retval);
-				if (orig_oldlen < sizeof(_PATH_LOCALBASE)) {
-					errno = ENOMEM;
-					return (-1);
-				}
-				*oldlenp = sizeof(_PATH_LOCALBASE);
-				memmove(oldp, _PATH_LOCALBASE, sizeof(_PATH_LOCALBASE));
-			}
-		}
-		return (0);
 	}
 
-	if (oldp && *oldlenp < sizeof(int)) {
+	if (oldp != NULL && *oldlenp < sizeof(int)) {
 		errno = ENOMEM;
 		return (-1);
 	}


More information about the svn-src-all mailing list