diff options
author | Baptiste Daroussin <bapt@FreeBSD.org> | 2014-10-28 11:20:30 +0000 |
---|---|---|
committer | Baptiste Daroussin <bapt@FreeBSD.org> | 2014-10-28 11:20:30 +0000 |
commit | b7e8ed77b08007dc43e75eeb44563caf5942668d (patch) | |
tree | f4aa8d98bffe21541481f0a5fd01df7844e63451 /pw | |
parent | 39a73752d4281a36dc27c622be330dc9491ed1af (diff) | |
download | pw-darwin-b7e8ed77b08007dc43e75eeb44563caf5942668d.tar.gz pw-darwin-b7e8ed77b08007dc43e75eeb44563caf5942668d.tar.zst pw-darwin-b7e8ed77b08007dc43e75eeb44563caf5942668d.zip |
When a group is renamed then the group has been invalidated for sure.
In that case get the group information using the new name.
Add a regression test about this bug
PR: 193704
Reported by: az
Diffstat (limited to 'pw')
-rw-r--r-- | pw/pw_group.c | 9 | ||||
-rwxr-xr-x | pw/tests/pw_modify.sh | 11 |
2 files changed, 17 insertions, 3 deletions
diff --git a/pw/pw_group.c b/pw/pw_group.c index 391e477..4ed6ea9 100644 --- a/pw/pw_group.c +++ b/pw/pw_group.c @@ -51,6 +51,7 @@ int pw_group(struct userconf * cnf, int mode, struct cargs * args) { int rc; + struct carg *a_newname = getarg(args, 'l'); struct carg *a_name = getarg(args, 'n'); struct carg *a_gid = getarg(args, 'g'); struct carg *arg; @@ -140,8 +141,8 @@ pw_group(struct userconf * cnf, int mode, struct cargs * args) if (a_gid) grp->gr_gid = (gid_t) atoi(a_gid->val); - if ((arg = getarg(args, 'l')) != NULL) - grp->gr_name = pw_checkname((u_char *)arg->val, 0); + if (a_newname != NULL) + grp->gr_name = pw_checkname((u_char *)a_newname->val, 0); } else { if (a_name == NULL) /* Required */ errx(EX_DATAERR, "group name required"); @@ -270,8 +271,10 @@ pw_group(struct userconf * cnf, int mode, struct cargs * args) warn("group update"); return EX_IOERR; } + + arg = a_newname != NULL ? a_newname : a_name; /* grp may have been invalidated */ - if ((grp = GETGRNAM(a_name->val)) == NULL) + if ((grp = GETGRNAM(arg->val)) == NULL) errx(EX_SOFTWARE, "group disappeared during update"); pw_log(cnf, mode, W_GROUP, "%s(%ld)", grp->gr_name, (long) grp->gr_gid); diff --git a/pw/tests/pw_modify.sh b/pw/tests/pw_modify.sh index 28a89e1..c3af517 100755 --- a/pw/tests/pw_modify.sh +++ b/pw/tests/pw_modify.sh @@ -27,8 +27,19 @@ groupmod_invalid_user_body() { atf_check -s exit:0 pw -V ${HOME} groupmod test -d foo } +atf_test_case groupmod_bug_193704 +groupmod_bug_193704_head() { + atf_set "descr" "Regression test for the #193704 bug" +} +groupmod_bug_193704_body() { + populate_etc_skel + atf_check -s exit:0 -x pw -V ${HOME} groupadd test + atf_check -s exit:0 -x pw -V ${HOME} groupmod test -l newgroupname + atf_check -s exit:65 -e match:"^pw: unknown group" -x pw -V ${HOME} groupshow test +} atf_init_test_cases() { atf_add_test_case groupmod_user atf_add_test_case groupmod_invalid_user + atf_add_test_case groupmod_bug_193704 } |