summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGlen Barber <gjb@FreeBSD.org>2016-01-04 19:19:48 +0000
committerGlen Barber <gjb@FreeBSD.org>2016-01-04 19:19:48 +0000
commitffdcb58dbba641f7594de91c430bd54ff12e57fb (patch)
tree316e945fb4c41a42f8e6dd13710f7ae0cd112359
parent3deb3f6771d46e43dd7306d3d2398f195dea94fa (diff)
parenta05d621a3b9a8e41b02c61a781b9d6390d6d30ec (diff)
downloadpw-darwin-ffdcb58dbba641f7594de91c430bd54ff12e57fb.tar.gz
pw-darwin-ffdcb58dbba641f7594de91c430bd54ff12e57fb.tar.zst
pw-darwin-ffdcb58dbba641f7594de91c430bd54ff12e57fb.zip
MFH r289384-r293170
Sponsored by: The FreeBSD Foundation
-rw-r--r--pw/pw_conf.c2
-rw-r--r--pw/pw_group.c7
-rw-r--r--pw/pw_user.c27
-rw-r--r--pw/pw_vpw.c2
-rwxr-xr-xpw/tests/pw_lock.sh20
5 files changed, 44 insertions, 14 deletions
diff --git a/pw/pw_conf.c b/pw/pw_conf.c
index e9606b4..d30c80e 100644
--- a/pw/pw_conf.c
+++ b/pw/pw_conf.c
@@ -313,7 +313,7 @@ read_userconfig(char const * file)
? NULL : newstr(q);
break;
case _UC_EXTRAGROUPS:
- for (i = 0; q != NULL; q = strtok(NULL, toks)) {
+ while ((q = strtok(NULL, toks)) != NULL) {
if (config.groups == NULL)
config.groups = sl_init();
sl_add(config.groups, newstr(q));
diff --git a/pw/pw_group.c b/pw/pw_group.c
index 711ef68..289a4c8 100644
--- a/pw/pw_group.c
+++ b/pw/pw_group.c
@@ -259,7 +259,7 @@ pw_group_next(int argc, char **argv, char *arg1 __unused)
struct userconf *cnf;
const char *cfg = NULL;
int ch;
- bool quiet;
+ bool quiet = false;
while ((ch = getopt(argc, argv, "Cq")) != -1) {
switch (ch) {
@@ -664,6 +664,11 @@ pw_group_mod(int argc, char **argv, char *arg1)
grp_add_members(&grp, newmembers);
}
+ if (dryrun) {
+ print_group(grp, pretty);
+ return (EXIT_SUCCESS);
+ }
+
if ((rc = chggrent(name, grp)) != 0) {
if (rc == -1)
errx(EX_IOERR, "group '%s' not available (NIS?)",
diff --git a/pw/pw_user.c b/pw/pw_user.c
index 1af8f81..30a2749 100644
--- a/pw/pw_user.c
+++ b/pw/pw_user.c
@@ -107,8 +107,10 @@ mkdir_home_parents(int dfd, const char *dir)
errx(EX_UNAVAILABLE, "out of memory");
tmp = strrchr(dirs, '/');
- if (tmp == NULL)
+ if (tmp == NULL) {
+ free(dirs);
return;
+ }
tmp[0] = '\0';
/*
@@ -272,7 +274,7 @@ pw_userlock(char *arg1, int mode)
char *passtmp = NULL;
char *name;
bool locked = false;
- uid_t id;
+ uid_t id = (uid_t)-1;
if (geteuid() != 0)
errx(EX_NOPERM, "you must be root");
@@ -280,15 +282,19 @@ pw_userlock(char *arg1, int mode)
if (arg1 == NULL)
errx(EX_DATAERR, "username or id required");
- if (arg1[strspn(arg1, "0123456789")] == '\0')
- id = pw_checkid(arg1, UID_MAX);
- else
- name = arg1;
+ name = arg1;
+ if (arg1[strspn(name, "0123456789")] == '\0')
+ id = pw_checkid(name, UID_MAX);
- pwd = (name != NULL) ? GETPWNAM(pw_checkname(name, 0)) : GETPWUID(id);
+ pwd = GETPWNAM(pw_checkname(name, 0));
+ if (pwd == NULL && id != (uid_t)-1) {
+ pwd = GETPWUID(id);
+ if (pwd != NULL)
+ name = pwd->pw_name;
+ }
if (pwd == NULL) {
- if (name == NULL)
- errx(EX_NOUSER, "no such uid `%ju'", (uintmax_t) id);
+ if (id == (uid_t)-1)
+ errx(EX_NOUSER, "no such name or uid `%ju'", (uintmax_t) id);
errx(EX_NOUSER, "no such user `%s'", name);
}
@@ -636,7 +642,8 @@ pw_checkname(char *name, int gecos)
}
if (!reject) {
while (*ch) {
- if (strchr(badchars, *ch) != NULL || *ch < ' ' ||
+ if (strchr(badchars, *ch) != NULL ||
+ (!gecos && *ch < ' ') ||
*ch == 127) {
reject = 1;
break;
diff --git a/pw/pw_vpw.c b/pw/pw_vpw.c
index a23c66e..2d1c75b 100644
--- a/pw/pw_vpw.c
+++ b/pw/pw_vpw.c
@@ -70,7 +70,6 @@ vnextpwent(char const *nam, uid_t uid, int doclose)
pw = NULL;
line = NULL;
linecap = 0;
- linelen = 0;
if (pwd_fp != NULL || (pwd_fp = fopen(getpwpath(_MASTERPASSWD), "r")) != NULL) {
while ((linelen = getline(&line, &linecap, pwd_fp)) > 0) {
@@ -153,7 +152,6 @@ vnextgrent(char const *nam, gid_t gid, int doclose)
gr = NULL;
line = NULL;
linecap = 0;
- linelen = 0;
if (grp_fp != NULL || (grp_fp = fopen(getgrpath(_GROUP), "r")) != NULL) {
while ((linelen = getline(&line, &linecap, grp_fp)) > 0) {
diff --git a/pw/tests/pw_lock.sh b/pw/tests/pw_lock.sh
index 9f14e24..5ec1b09 100755
--- a/pw/tests/pw_lock.sh
+++ b/pw/tests/pw_lock.sh
@@ -16,7 +16,27 @@ user_locking_body() {
grep "^test:\*:1001:" $HOME/master.passwd
}
+atf_test_case numeric_locking cleanup
+numeric_locking_body() {
+ populate_etc_skel
+ ${PW} useradd test || atf_fail "Creating test user"
+ ${PW} lock 1001 || atf_fail "Locking the user"
+ atf_check -s exit:0 -o match:"^test:\*LOCKED\*\*:1001:" \
+ grep "^test:\*LOCKED\*\*:1001:" $HOME/master.passwd
+ ${PW} unlock 1001 || atf_fail "Unlocking the user"
+ atf_check -s exit:0 -o match:"^test:\*:1001:" \
+ grep "^test:\*:1001:" $HOME/master.passwd
+ # Now numeric names
+ ${PW} useradd -n 1001 || atf_fail "Creating test user"
+ ${PW} lock 1001 || atf_fail "Locking the user"
+ atf_check -s exit:0 -o match:"^1001:\*LOCKED\*\*:1002:" \
+ grep "^1001:\*LOCKED\*\*:1002:" $HOME/master.passwd
+ ${PW} unlock 1001 || atf_fail "Unlocking the user"
+ atf_check -s exit:0 -o match:"^1001:\*:1002:" \
+ grep "^1001:\*:1002:" $HOME/master.passwd
+}
atf_init_test_cases() {
atf_add_test_case user_locking
+ atf_add_test_case numeric_locking
}