svn commit: r367243 - in head: lib/libc/gen sys/kern

Oliver Pinter oliver.pntr at gmail.com
Sun Nov 1 12:53:16 UTC 2020


On Sunday, November 1, 2020, Stefan Eßer <se at freebsd.org> wrote:

> 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



 Wouldn't be better to make this variable a per-jail variable?

>
> 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-head at freebsd.org mailing list
> https://lists.freebsd.org/mailman/listinfo/svn-src-head
> To unsubscribe, send any mail to "svn-src-head-unsubscribe at freebsd.org"
>


More information about the svn-src-head mailing list