Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 7 Mar 2021 21:39:37 GMT
From:      Kyle Evans <kevans@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org
Subject:   git: 872ec7e5b6f3 - stable/13 - service(8): use an environment more consistent with init(8)
Message-ID:  <202103072139.127Ldb9e061433@gitrepo.freebsd.org>

next in thread | raw e-mail | index | archive | help
The branch stable/13 has been updated by kevans:

URL: https://cgit.FreeBSD.org/src/commit/?id=872ec7e5b6f35d84745b49c02f58572632de22ed

commit 872ec7e5b6f35d84745b49c02f58572632de22ed
Author:     Andrew Gierth <andrew@tao146.riddles.org.uk>
AuthorDate: 2021-03-03 18:25:11 +0000
Commit:     Kyle Evans <kevans@FreeBSD.org>
CommitDate: 2021-03-07 21:39:30 +0000

    service(8): use an environment more consistent with init(8)
    
    init(8) sets the "daemon" login class without specifying a pw
    entry (so no substitutions are done on the variables). service(8)'s
    use of env -L had the effect of specifying root's pw entry, with two
    effects: getpwnam and getpwuid are being called, which may not be
    entirely safe depending on what nsswitch is up to and what stage of
    boot we are at, and substitutions would have been done.
    
    Fix by teaching env(8) to allow -L -/classname to set the class
    environment with no pw entry at all specified, and use it in
    service(8).
    
    PR:             253959
    
    (cherry picked from commit 55deb0a5f089c8a27cfc1666655b93881c2b47ae)
    (cherry picked from commit 0c1a5eaae83267365330437adb60f44e1a622a2b)
---
 usr.bin/env/env.1           |  7 ++++++-
 usr.bin/env/env.c           | 25 ++++++++++++++++---------
 usr.sbin/service/service.sh |  2 +-
 3 files changed, 23 insertions(+), 11 deletions(-)

diff --git a/usr.bin/env/env.1 b/usr.bin/env/env.1
index 8c0527608506..9aff9508e47b 100644
--- a/usr.bin/env/env.1
+++ b/usr.bin/env/env.1
@@ -31,7 +31,7 @@
 .\" From FreeBSD: src/usr.bin/printenv/printenv.1,v 1.17 2002/11/26 17:33:35 ru Exp
 .\" $FreeBSD$
 .\"
-.Dd November 11, 2020
+.Dd March 3, 2021
 .Dt ENV 1
 .Os
 .Sh NAME
@@ -104,6 +104,11 @@ is used, then the specified user's
 .Pa ~/.login_conf
 is read as well.
 The user may be specified by name or by uid.
+If a username of
+.Sq Li \&-
+is given, then no user lookup will be done, the login class will default to
+.Sq Li default
+if not explicitly given, and no substitutions will be done on the values.
 .\"	-P
 .It Fl P Ar altpath
 Search the set of directories as specified by
diff --git a/usr.bin/env/env.c b/usr.bin/env/env.c
index e408577ea7a4..a0f55d665a9a 100644
--- a/usr.bin/env/env.c
+++ b/usr.bin/env/env.c
@@ -144,16 +144,23 @@ main(int argc, char **argv)
 		login_class = strchr(login_name, '/');
 		if (login_class)
 			*login_class++ = '\0';
-		pw = getpwnam(login_name);
-		if (pw == NULL) {
-			char *endp = NULL;
-			errno = 0;
-			uid = strtoul(login_name, &endp, 10);
-			if (errno == 0 && *endp == '\0')
-				pw = getpwuid(uid);
+		if (*login_name != '\0' && strcmp(login_name, "-") != 0) {
+			pw = getpwnam(login_name);
+			if (pw == NULL) {
+				char *endp = NULL;
+				errno = 0;
+				uid = strtoul(login_name, &endp, 10);
+				if (errno == 0 && *endp == '\0')
+					pw = getpwuid(uid);
+			}
+			if (pw == NULL)
+				errx(EXIT_FAILURE, "no such user: %s", login_name);
 		}
-		if (pw == NULL)
-			errx(EXIT_FAILURE, "no such user: %s", login_name);
+		/*
+		 * Note that it is safe for pw to be null here; the libutil
+		 * code handles that, bypassing substitution of $ and using
+		 * the class "default" if no class name is given either.
+		 */
 		if (login_class != NULL) {
 			lc = login_getclass(login_class);
 			if (lc == NULL)
diff --git a/usr.sbin/service/service.sh b/usr.sbin/service/service.sh
index 42a50fcf61b9..df2869f98a6c 100755
--- a/usr.sbin/service/service.sh
+++ b/usr.sbin/service/service.sh
@@ -165,7 +165,7 @@ cd /
 for dir in /etc/rc.d $local_startup; do
 	if [ -x "$dir/$script" ]; then
 		[ -n "$VERBOSE" ] && echo "$script is located in $dir"
-		exec env -i -L 0/daemon HOME=/ PATH=/sbin:/bin:/usr/sbin:/usr/bin "$dir/$script" "$@"
+		exec env -i -L -/daemon HOME=/ PATH=/sbin:/bin:/usr/sbin:/usr/bin "$dir/$script" "$@"
 	fi
 done
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202103072139.127Ldb9e061433>