]> git.ipfire.org Git - thirdparty/shadow.git/commitdiff
* NEWS, src/newgrp.c: Fix segfault when an user returns to an
authornekral-guest <nekral-guest@5a98b0ae-9ef6-0310-add3-de5d479b70d7>
Mon, 21 Jan 2008 23:33:43 +0000 (23:33 +0000)
committernekral-guest <nekral-guest@5a98b0ae-9ef6-0310-add3-de5d479b70d7>
Mon, 21 Jan 2008 23:33:43 +0000 (23:33 +0000)
  unknown GID (either the user was deleted during the user's newgrp
  session or the user's passwd entry referenced an invalid group).
  Add a syslog warning in that case.
* src/newgrp.c: Add an end of line when reporting an invalid
  password.

ChangeLog
NEWS
src/newgrp.c

index ff4ea399d2bd92e77f3e089de084bf4c760e94b2..bb97bac2a3acafac3916c85cd8fb2d2b2e0b96c3 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2008-01-22  Nicolas François  <nicolas.francois@centraliens.net>
+
+       * NEWS, src/newgrp.c: Fix segfault when an user returns to an
+       unknown GID (either the user was deleted during the user's newgrp
+       session or the user's passwd entry referenced an invalid group).
+       Add a syslog warning in that case.
+       * src/newgrp.c: Add an end of line when reporting an invalid
+       password.
+
 2008-01-12  Nicolas François  <nicolas.francois@centraliens.net>
 
        * NEWS, src/useradd.c: Fix the handling of the --defaults option
diff --git a/NEWS b/NEWS
index 03f84b62c121c2ef5145bea4cc02d99209ea5b52..d0c892968ae0a6a98efe0f7a089178012b667a36 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -26,6 +26,10 @@ shadow-4.1.0 -> shadow-4.1.1                                         UNRELEASED
 - lastlog
   * Accept users specified as a numerical UID, or ranges of users (-user,
     user-, user1-user2).
+- newgrp
+  * Fix segfault when an user returns to an unknown GID (either the user
+    was deleted during the user's newgrp session or the user's passwd
+    entry referenced an invalid group). Add a syslog warning in that case.
 - newusers
   * The new users are no more added to the list of members of their groups
     because the membership is already set by their primary group.
index 5cc65fd18eb2492286b1399865ef4bcea6b18c42..de06dbed28372f16a7a68c5924c1bf9d52fa4917 100644 (file)
@@ -169,7 +169,7 @@ static void check_perms (const struct group *grp,
                                 "Invalid password for group `%s' from `%s'",
                                 groupname, pwd->pw_name));
                        sleep (1);
-                       fputs (_("Invalid password."), stderr);
+                       fputs (_("Invalid password.\n"), stderr);
                        goto failure;
                }
        }
@@ -252,6 +252,8 @@ static void syslog_sg (const char *name, const char *group)
                } else if (child) {
                        /* parent - wait for child to finish, then log session close */
                        int cst = 0;
+                       gid_t gid = getgid();
+                       struct group *grp = getgrgid (gid);
 
                        do {
                                errno = 0;
@@ -265,10 +267,22 @@ static void syslog_sg (const char *name, const char *group)
                        } while ((pid == child && WIFSTOPPED (cst)) ||
                                 (pid != child && errno == EINTR));
                        /* local, no need for xgetgrgid */
-                       SYSLOG ((LOG_INFO,
-                                "user `%s' (login `%s' on %s) returned to group `%s'",
-                                name, loginname, tty,
-                                getgrgid (gid)->gr_name));
+                       if (NULL != grp) {
+                               SYSLOG ((LOG_INFO,
+                                        "user `%s' (login `%s' on %s) returned to group `%s'",
+                                        name, loginname, tty, grp->gr_name));
+                       } else {
+                               SYSLOG ((LOG_INFO,
+                                        "user `%s' (login `%s' on %s) returned to group `%d'",
+                                        name, loginname, tty, gid));
+                               /* Either the user's passwd entry has a
+                                * GID that does not match with any group,
+                                * or the group was deleted while the user
+                                * was in a newgrp session.*/
+                               SYSLOG ((LOG_WARN,
+                                        "unknown GID `%u' used by user `%s'",
+                                        gid, name));
+                       }
                        closelog ();
                        exit (0);
                }