diff options
author | Mateusz Guzik <mjg@FreeBSD.org> | 2014-06-27 18:51:19 +0000 |
---|---|---|
committer | Mateusz Guzik <mjg@FreeBSD.org> | 2014-06-27 18:51:19 +0000 |
commit | 541ffe0f9d8c657b529483a6725a6f2b4b45058e (patch) | |
tree | 9387d67fac5a69e571cf1d96690cbbe9e519f0de /pw | |
parent | a3c0ba2575fa986313cd0d49c625570a14e0e0f2 (diff) | |
download | pw-darwin-541ffe0f9d8c657b529483a6725a6f2b4b45058e.tar.gz pw-darwin-541ffe0f9d8c657b529483a6725a6f2b4b45058e.tar.zst pw-darwin-541ffe0f9d8c657b529483a6725a6f2b4b45058e.zip |
pw: fix up deletion of users from groups
Previuosly given 'foo,bar' members, removing 'foo' would result in an
infinite loop.
PR: 191427
Submitted by: Voradesh Yenbut <yenbut cs.washington.edu>
MFC after: 1 week
Diffstat (limited to 'pw')
-rw-r--r-- | pw/pw_user.c | 7 |
1 files changed, 3 insertions, 4 deletions
diff --git a/pw/pw_user.c b/pw/pw_user.c index 4b3f550..36c5d9d 100644 --- a/pw/pw_user.c +++ b/pw/pw_user.c @@ -438,14 +438,13 @@ pw_user(struct userconf * cnf, int mode, struct cargs * args) delgrent(GETGRNAM(a_name->val)); SETGRENT(); while ((grp = GETGRENT()) != NULL) { - int i; + int i, j; char group[MAXLOGNAME]; if (grp->gr_mem != NULL) { for (i = 0; grp->gr_mem[i] != NULL; i++) { if (!strcmp(grp->gr_mem[i], a_name->val)) { - while (grp->gr_mem[i] != NULL) { - grp->gr_mem[i] = grp->gr_mem[i+1]; - } + for (j = i; grp->gr_mem[j] != NULL; j++) + grp->gr_mem[j] = grp->gr_mem[j+1]; strlcpy(group, grp->gr_name, MAXLOGNAME); chggrent(group, grp); } |