svn commit: r285434 - in head/usr.sbin/pw: . tests

Baptiste Daroussin bapt at FreeBSD.org
Sun Jul 12 22:09:00 UTC 2015


Author: bapt
Date: Sun Jul 12 22:08:58 2015
New Revision: 285434
URL: https://svnweb.freebsd.org/changeset/base/285434

Log:
  Ensure skeldir is abolute path (relatively to the rootdir)

Modified:
  head/usr.sbin/pw/pw_user.c
  head/usr.sbin/pw/tests/pw_useradd.sh
  head/usr.sbin/pw/tests/pw_userdel.sh

Modified: head/usr.sbin/pw/pw_user.c
==============================================================================
--- head/usr.sbin/pw/pw_user.c	Sun Jul 12 21:43:57 2015	(r285433)
+++ head/usr.sbin/pw/pw_user.c	Sun Jul 12 22:08:58 2015	(r285434)
@@ -74,8 +74,9 @@ create_and_populate_homedir(struct passw
 	skeldir = cnf->dotdir;
 
 	if (skeldir != NULL && *skeldir != '\0') {
-		skelfd = openat(conf.rootfd, cnf->dotdir,
-		    O_DIRECTORY|O_CLOEXEC);
+		if (*skeldir == '/')
+			skeldir++;
+		skelfd = openat(conf.rootfd, skeldir, O_DIRECTORY|O_CLOEXEC);
 	}
 
 	copymkdir(conf.rootfd, pwd->pw_dir, skelfd, cnf->homemode, pwd->pw_uid,
@@ -449,8 +450,13 @@ pw_user(int mode, char *name, long id, s
 	}
 
 	if ((arg = getarg(args, 'k')) != NULL) {
-		if (stat(cnf->dotdir = arg->val, &st) == -1 || !S_ISDIR(st.st_mode))
-			errx(EX_OSFILE, "skeleton `%s' is not a directory or does not exist", cnf->dotdir);
+		char *tmp = cnf->dotdir = arg->val;
+		if (*tmp == '/')
+			tmp++;
+		if ((fstatat(conf.rootfd, tmp, &st, 0) == -1) ||
+		    !S_ISDIR(st.st_mode))
+			errx(EX_OSFILE, "skeleton `%s' is not a directory or "
+			    "does not exist", cnf->dotdir);
 	}
 
 	if ((arg = getarg(args, 's')) != NULL)

Modified: head/usr.sbin/pw/tests/pw_useradd.sh
==============================================================================
--- head/usr.sbin/pw/tests/pw_useradd.sh	Sun Jul 12 21:43:57 2015	(r285433)
+++ head/usr.sbin/pw/tests/pw_useradd.sh	Sun Jul 12 22:08:58 2015	(r285434)
@@ -268,7 +268,7 @@ user_add_skel_body() {
 	echo "c" > ${HOME}/skel/c/d/dot.c
 	mkdir ${HOME}/home
 	ln -sf /nonexistent ${HOME}/skel/c/foo
-	atf_check -s exit:0 ${RPW} useradd foo -k skel -m
+	atf_check -s exit:0 ${RPW} useradd foo -k /skel -m
 	test -d ${HOME}/home/foo || atf_fail "Directory not created"
 	test -f ${HOME}/home/foo/.a || atf_fail "File not created"
 	atf_check -o file:${HOME}/skel/.a -s exit:0 cat ${HOME}/home/foo/.a

Modified: head/usr.sbin/pw/tests/pw_userdel.sh
==============================================================================
--- head/usr.sbin/pw/tests/pw_userdel.sh	Sun Jul 12 21:43:57 2015	(r285433)
+++ head/usr.sbin/pw/tests/pw_userdel.sh	Sun Jul 12 22:08:58 2015	(r285434)
@@ -40,7 +40,7 @@ delete_files_body() {
 	mkdir -p ${HOME}/home
 	mkdir -p ${HOME}/var/mail
 	echo "foo wedontcare" > ${HOME}/etc/opiekeys
-	atf_check -s exit:0 ${RPW} useradd foo -k skel -m
+	atf_check -s exit:0 ${RPW} useradd foo -k /skel -m
 	test -d ${HOME}/home || atf_fail "Fail to create home directory"
 	test -f ${HOME}/var/mail/foo || atf_fail "Mail file not created"
 	atf_check -s exit:0 ${RPW} userdel foo -r


More information about the svn-src-all mailing list