The consensus seems to be that "chroot -u" should apply the settings
in /etc/login.conf by default.  Since this is a non-standard flag
we can do what we like with it.  I should have used setusercontext()
when I added -u to chroot in the first place.

We can add a "-c class" option in the future if there turns out to
be a need for it.

 - todd

Index: usr.sbin/chroot/chroot.8
===================================================================
RCS file: /cvs/src/usr.sbin/chroot/chroot.8,v
retrieving revision 1.14
diff -u -p -u -r1.14 chroot.8
--- usr.sbin/chroot/chroot.8    8 Jul 2010 06:52:30 -0000       1.14
+++ usr.sbin/chroot/chroot.8    19 May 2015 15:47:52 -0000
@@ -77,6 +77,11 @@ and
 databases unless overridden by the
 .Fl g
 option.
+Additional settings may be applied as specified in
+.Xr login.conf 5
+depending on
+.Ar user Ns 's
+login class.
 .El
 .Sh ENVIRONMENT
 .Bl -tag -width SHELL
@@ -95,6 +100,7 @@ is used.
 .Sh SEE ALSO
 .Xr ldd 1 ,
 .Xr group 5 ,
+.Xr login.conf 5 ,
 .Xr passwd 5 ,
 .Xr environ 7
 .Sh HISTORY
Index: usr.sbin/chroot/chroot.c
===================================================================
RCS file: /cvs/src/usr.sbin/chroot/chroot.c,v
retrieving revision 1.13
diff -u -p -u -r1.13 chroot.c
--- usr.sbin/chroot/chroot.c    27 Oct 2009 23:59:51 -0000      1.13
+++ usr.sbin/chroot/chroot.c    19 May 2015 15:48:29 -0000
@@ -35,6 +35,7 @@
 #include <errno.h>
 #include <grp.h>
 #include <limits.h>
+#include <login_cap.h>
 #include <paths.h>
 #include <pwd.h>
 #include <stdio.h>
@@ -50,11 +51,14 @@ main(int argc, char **argv)
 {
        struct group    *grp;
        struct passwd   *pwd;
+       login_cap_t     *lc;
        const char      *shell;
        char            *user, *group, *grouplist;
        gid_t           gidlist[NGROUPS_MAX];
        int             ch, ngids;
+       int             flags = LOGIN_SETALL & ~(LOGIN_SETLOGIN|LOGIN_SETUSER);
 
+       lc = NULL;
        ngids = 0;
        pwd = NULL;
        user = grouplist = NULL;
@@ -80,8 +84,12 @@ main(int argc, char **argv)
        if (argc < 1)
                usage();
 
-       if (user != NULL && (pwd = getpwnam(user)) == NULL)
-               errx(1, "no such user `%s'", user);
+       if (user != NULL) {
+               if ((pwd = getpwnam(user)) == NULL)
+                       errx(1, "no such user `%s'", user);
+               if ((lc = login_getclass(pwd->pw_class)) == NULL)
+                       err(1, "unable to get login class for `%s'", user);
+       }
 
        while ((group = strsep(&grouplist, ",")) != NULL) {
                if (*group == '\0')
@@ -99,11 +107,11 @@ main(int argc, char **argv)
                        err(1, "setgid");
                if (setgroups(ngids, gidlist) != 0)
                        err(1, "setgroups");
-       } else if (pwd != NULL) {
-               if (setgid(pwd->pw_gid) != 0)
-                       err(1, "setgid");
-               if (initgroups(user, pwd->pw_gid) == -1)
-                       err(1, "initgroups");
+               flags &= ~LOGIN_SETGROUP;
+       }
+       if (lc != NULL) {
+               if (setusercontext(lc, pwd, pwd->pw_uid, flags) == -1)
+                       err(1, "setusercontext");
        }
 
        if (chroot(argv[0]) != 0 || chdir("/") != 0)
@@ -115,7 +123,6 @@ main(int argc, char **argv)
                        setlogin(pwd->pw_name);
                if (setuid(pwd->pw_uid) != 0)
                        err(1, "setuid");
-               endgrent();
        }
 
        if (argv[1]) {

Reply via email to