]> git.cameronkatri.com Git - pw-darwin.git/commitdiff
Fix pw(8) deletion of group "username" on userdel even if group "username"
authorDevin Teske <dteske@FreeBSD.org>
Thu, 13 Mar 2014 18:16:42 +0000 (18:16 +0000)
committerDevin Teske <dteske@FreeBSD.org>
Thu, 13 Mar 2014 18:16:42 +0000 (18:16 +0000)
is not associated with user "username". E.g., user "foo" has primary group
"wheel" and is unassociated with group "foo", yet userdel would delete the
group "foo" when deleting user "foo" (despite the fact that user "foo" is
not associated with group "foo" in any way).

Patch committed with minor style(9) changes.

PR: bin/169471
Submitted by: Alexander Pyhalov <apyhalov@gmail.com>

pw/pw_user.c

index e49de185c4ddcc6e91cd230839b44fa5fbda7950..4b3f55007f6b6ec3785df203f6005c17b9a7519d 100644 (file)
@@ -380,6 +380,8 @@ pw_user(struct userconf * cnf, int mode, struct cargs * args)
                        char            file[MAXPATHLEN];
                        char            home[MAXPATHLEN];
                        uid_t           uid = pwd->pw_uid;
+                       struct group    *gr;
+                       char            grname[LOGNAMESIZE];
 
                        if (strcmp(pwd->pw_name, "root") == 0)
                                errx(EX_DATAERR, "cannot remove user 'root'");
@@ -406,6 +408,11 @@ pw_user(struct userconf * cnf, int mode, struct cargs * args)
                         */
                        sprintf(file, "%s/%s", _PATH_MAILDIR, pwd->pw_name);
                        strlcpy(home, pwd->pw_dir, sizeof(home));
+                       gr = GETGRGID(pwd->pw_gid);
+                       if (gr != NULL)
+                               strlcpy(grname, gr->gr_name, LOGNAMESIZE);
+                       else
+                               grname[0] = '\0';
 
                        rc = delpwent(pwd);
                        if (rc == -1)
@@ -426,7 +433,8 @@ pw_user(struct userconf * cnf, int mode, struct cargs * args)
 
                        grp = GETGRNAM(a_name->val);
                        if (grp != NULL &&
-                           (grp->gr_mem == NULL || *grp->gr_mem == NULL))
+                           (grp->gr_mem == NULL || *grp->gr_mem == NULL) &&
+                           strcmp(a_name->val, grname) == 0)
                                delgrent(GETGRNAM(a_name->val));
                        SETGRENT();
                        while ((grp = GETGRENT()) != NULL) {