summaryrefslogtreecommitdiffstats
path: root/pw/pw_user.c
diff options
context:
space:
mode:
authorMateusz Guzik <mjg@FreeBSD.org>2014-06-27 18:51:19 +0000
committerMateusz Guzik <mjg@FreeBSD.org>2014-06-27 18:51:19 +0000
commit541ffe0f9d8c657b529483a6725a6f2b4b45058e (patch)
tree9387d67fac5a69e571cf1d96690cbbe9e519f0de /pw/pw_user.c
parenta3c0ba2575fa986313cd0d49c625570a14e0e0f2 (diff)
downloadpw-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/pw_user.c')
-rw-r--r--pw/pw_user.c7
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);
}