Hi!

On Mon, Sep 12, 2005 at 07:33:17AM +0200, [EMAIL PROTECTED] wrote:
> http://bugs.debian.org/295416 is a long bug long, but it can be
> resumed as:
> 
> [EMAIL PROTECTED]:~# groupadd bug295416
> [EMAIL PROTECTED]:~# useradd -g bug295416 bug295416
> [EMAIL PROTECTED]:~# useradd -g bug295416 other295416
> [EMAIL PROTECTED]:~# userdel bug295416
> [EMAIL PROTECTED]:~# getent group bug295416
> [EMAIL PROTECTED]:~# 
> 
> Das ist nich gut....
> 
> I'm pretty sure that finding a patch for this is easy, if we assume
> that Tomasz is currently focused on other tasks and can't handle it.

The attached patch do not really fix this, but can be used as a basis.

I think we all agree that the user must be warned, don't we?

The problem is shall we remove the group or not? Do we need a special
return value?
What should the warning tell? Currently:
    Warning: The primary group of bug295416 (bug295416, GID=1003)
    will be removed, but is also the primary group of other295416
    (ID=1002).

I tend to agree with Alexander: if we delete the group (with a warning),
the system databases won't be consistent.
I would prefer to let the group, and warn the administrator, so that she
can delete the group with groupdel if needed.

Kind Regards,
-- 
Nekral
--- userdel.c.orig      2005-10-01 17:06:55.000000000 +0200
+++ userdel.c   2005-10-01 18:27:16.000000000 +0200
@@ -121,6 +121,7 @@
 {
        const struct group *grp;
        struct group *ngrp;
+       struct passwd *pwd;
 
 #ifdef SHADOWGRP
        int deleted_user_group = 0;
@@ -174,6 +175,21 @@
        if (grp && getdef_bool ("USERGROUPS_ENAB")
            && (grp->gr_mem[0] == NULL)) {
 
+               /*
+                * Scan the passwd file to check if this group is still
+                * used as a primary group.
+                */
+               setpwent ();
+               while ((pwd = getpwent ())) {
+                       if (strcmp (pwd->pw_name, user_name) == 0)
+                               continue;
+                       if (pwd->pw_gid == grp->gr_gid) {
+                               printf("Warning: The primary group of %s (%s, 
GID=%d) will be removed, but is also the primary group of %s (ID=%d).\n", 
user_name, grp->gr_name, grp->gr_gid, pwd->pw_name, pwd->pw_uid);
+                               /* break; */
+                       }
+               }
+               endpwent();
+
                gr_remove (grp->gr_name);
 
 #ifdef SHADOWGRP
@@ -658,6 +674,7 @@
                                break;
                        }
                }
+               endpwent();
        }
 #endif
 

Reply via email to