From c1e7bb989dbd01e5ed534b0db64aa19b97f2262c Mon Sep 17 00:00:00 2001 From: Baptiste Daroussin Date: Sun, 12 Jul 2015 22:08:58 +0000 Subject: Ensure skeldir is abolute path (relatively to the rootdir) --- pw/pw_user.c | 14 ++++++++++---- pw/tests/pw_useradd.sh | 2 +- pw/tests/pw_userdel.sh | 2 +- 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 -- cgit v1.2.3-56-ge451