summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBaptiste Daroussin <bapt@FreeBSD.org>2015-07-12 22:08:58 +0000
committerBaptiste Daroussin <bapt@FreeBSD.org>2015-07-12 22:08:58 +0000
commitc1e7bb989dbd01e5ed534b0db64aa19b97f2262c (patch)
tree40d748945f4c5728dae581732e62a84353ef7a9d
parenta5020ce2c4306656996725b75203311f5ebf8e91 (diff)
downloadpw-darwin-c1e7bb989dbd01e5ed534b0db64aa19b97f2262c.tar.gz
pw-darwin-c1e7bb989dbd01e5ed534b0db64aa19b97f2262c.tar.zst
pw-darwin-c1e7bb989dbd01e5ed534b0db64aa19b97f2262c.zip
Ensure skeldir is abolute path (relatively to the rootdir)
-rw-r--r--pw/pw_user.c14
-rwxr-xr-xpw/tests/pw_useradd.sh2
-rwxr-xr-xpw/tests/pw_userdel.sh2
3 files changed, 12 insertions, 6 deletions
diff --git a/pw/pw_user.c b/pw/pw_user.c
index fd2c80a..8ba2807 100644
--- a/pw/pw_user.c
+++ b/pw/pw_user.c
@@ -74,8 +74,9 @@ create_and_populate_homedir(struct passwd *pwd)
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, struct cargs * args)
}
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)
diff --git a/pw/tests/pw_useradd.sh b/pw/tests/pw_useradd.sh
index 4cda4c8..6c71af6 100755
--- a/pw/tests/pw_useradd.sh
+++ b/pw/tests/pw_useradd.sh
@@ -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
diff --git a/pw/tests/pw_userdel.sh b/pw/tests/pw_userdel.sh
index 744568a..5ba87c2 100755
--- a/pw/tests/pw_userdel.sh
+++ b/pw/tests/pw_userdel.sh
@@ -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