Author: se
Date: Sat Oct 31 23:48:41 2020
New Revision: 367243
URL: https://svnweb.freebsd.org/changeset/base/367243

Log:
  Make sysctl user.local a tunable that can be written at run-time
  
  This sysctl value had been provided as a read-only variable that is
  compiled into the C library based on the value of _PATH_LOCALBASE in
  paths.h.
  
  After this change, the value is compiled into the kernel as an empty
  string, which is translated to _PATH_LOCALBASE by the C library.
  
  This empty string can be overridden at boot time or by a privileged
  user at run time and will then be returned by sysctl.
  
  When set to an empty string, the value returned by sysctl reverts to
  _PATH_LOCALBASE.
  
  This update does not change the behavior on any system that does
  not modify the default value of user.localbase.
  
  I consider this change as experimental and would prefer if the run-time
  write permission was reconsidered and the sysctl variable defined with
  CLFLAG_RDTUN instead to restrict it to be set at boot time.
  
  MFC after:    1 month

Modified:
  head/lib/libc/gen/sysctl.c
  head/sys/kern/kern_mib.c

Modified: head/lib/libc/gen/sysctl.c
==============================================================================
--- head/lib/libc/gen/sysctl.c  Sat Oct 31 23:19:59 2020        (r367242)
+++ head/lib/libc/gen/sysctl.c  Sat Oct 31 23:48:41 2020        (r367243)
@@ -68,14 +68,14 @@ sysctl(const int *name, u_int namelen, void *oldp, siz
        if (retval || name[0] != CTL_USER)
                return (retval);
 
-       if (newp != NULL) {
-               errno = EPERM;
-               return (-1);
-       }
        if (namelen != 2) {
                errno = EINVAL;
                return (-1);
        }
+       if (newp != NULL && name[1] != USER_LOCALBASE) {
+               errno = EPERM;
+               return (-1);
+       }
 
        switch (name[1]) {
        case USER_CS_PATH:
@@ -88,13 +88,21 @@ sysctl(const int *name, u_int namelen, void *oldp, siz
                        memmove(oldp, _PATH_STDPATH, sizeof(_PATH_STDPATH));
                return (0);
        case USER_LOCALBASE:
-               if (oldp != NULL && orig_oldlen < sizeof(_PATH_LOCALBASE)) {
-                       errno = ENOMEM;
-                       return (-1);
+               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));
+                       }
                }
-               *oldlenp = sizeof(_PATH_LOCALBASE);
-               if (oldp != NULL)
-                       memmove(oldp, _PATH_LOCALBASE, sizeof(_PATH_LOCALBASE));
                return (0);
        }
 

Modified: head/sys/kern/kern_mib.c
==============================================================================
--- head/sys/kern/kern_mib.c    Sat Oct 31 23:19:59 2020        (r367242)
+++ head/sys/kern/kern_mib.c    Sat Oct 31 23:48:41 2020        (r367243)
@@ -652,8 +652,11 @@ SYSCTL_INT(_user, USER_STREAM_MAX, stream_max, CTLFLAG
     SYSCTL_NULL_INT_PTR, 0, "Min Maximum number of streams a process may have 
open at one time");
 SYSCTL_INT(_user, USER_TZNAME_MAX, tzname_max, CTLFLAG_RD,
     SYSCTL_NULL_INT_PTR, 0, "Min Maximum number of types supported for 
timezone names");
-SYSCTL_STRING(_user, USER_LOCALBASE, localbase, CTLFLAG_RD,
-    "", 0, "Prefix used to install and locate add-on packages");
+
+static char localbase[MAXPATHLEN] = "";
+
+SYSCTL_STRING(_user, USER_LOCALBASE, localbase, CTLFLAG_RWTUN,
+    localbase, sizeof(localbase), "Prefix used to install and locate add-on 
packages");
 
 #include <sys/vnode.h>
 SYSCTL_INT(_debug_sizeof, OID_AUTO, vnode, CTLFLAG_RD,
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to