svn commit: r367243 - in head: lib/libc/gen sys/kern
Stefan Eßer
se at FreeBSD.org
Sat Oct 31 23:48:42 UTC 2020
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,
More information about the svn-src-all
mailing list