Blob Blame History Raw
diff -urp shadow-4.1.0.orig/src/newgrp.c shadow-4.1.0/src/newgrp.c
--- shadow-4.1.0.orig/src/newgrp.c	2007-11-18 18:15:05.000000000 -0500
+++ shadow-4.1.0/src/newgrp.c	2008-03-06 10:01:17.000000000 -0500
@@ -122,6 +123,8 @@ int main (int argc, char **argv)
 #endif
 
 #ifdef WITH_AUDIT
+	char audit_buf[80];
+
 	audit_help_open ();
 #endif
 	setlocale (LC_ALL, "");
@@ -164,7 +167,7 @@ int main (int argc, char **argv)
 	if (!pwd) {
 		fprintf (stderr, _("unknown UID: %u\n"), getuid ());
 #ifdef WITH_AUDIT
-		audit_logger (AUDIT_USER_START, Prog, "changing", NULL,
+		audit_logger (AUDIT_CHGRP_ID, Prog, "changing", NULL,
 			      getuid (), 0);
 #endif
 		SYSLOG ((LOG_WARN, "unknown UID %u", getuid ()));
@@ -272,7 +275,13 @@ int main (int argc, char **argv)
 	if (ngroups < 0) {
 		perror ("getgroups");
 #ifdef WITH_AUDIT
-		audit_logger (AUDIT_USER_START, Prog,
+		if (group) {
+			snprintf (audit_buf, sizeof(audit_buf),
+				"changing new_group=%s", group);
+			audit_logger (AUDIT_CHGRP_ID, Prog,
+				audit_buf, NULL, getuid (), 0);
+		} else
+			audit_logger (AUDIT_CHGRP_ID, Prog,
 			      "changing", NULL, getuid (), 0);
 #endif
 		exit (1);
@@ -394,13 +403,26 @@ int main (int argc, char **argv)
 
 		if (grp->gr_passwd[0] == '\0' ||
 		    strcmp (cpasswd, grp->gr_passwd) != 0) {
+#ifdef WITH_AUDIT
+			snprintf (audit_buf, sizeof(audit_buf),
+				"authentication new_gid=%d",
+				grp->gr_gid);
+			audit_logger (AUDIT_GRP_AUTH, Prog,
+				audit_buf, NULL, getuid (), 0);
+#endif
 			SYSLOG ((LOG_INFO,
 				 "Invalid password for group `%s' from `%s'",
 				 group, name));
 			sleep (1);
-			fputs (_("Invalid password."), stderr);
+			fputs (_("Invalid password.\n"), stderr);
 			goto failure;
 		}
+#ifdef WITH_AUDIT
+		snprintf (audit_buf, sizeof(audit_buf),
+			"authentication new_gid=%d", grp->gr_gid);
+		audit_logger (AUDIT_GRP_AUTH, Prog,
+			audit_buf, NULL, getuid (), 1);
+#endif
 	}
 
 	/*
@@ -458,10 +480,16 @@ int main (int argc, char **argv)
 		child = fork ();
 		if (child < 0) {
 			/* error in fork() */
-			fprintf (stderr, _("%s: failure forking: %s"),
+			fprintf (stderr, _("%s: failure forking: %s\n"),
 				 is_newgrp ? "newgrp" : "sg", strerror (errno));
 #ifdef WITH_AUDIT
-			audit_logger (AUDIT_USER_START, Prog, "changing",
+			if (group) {
+				snprintf (audit_buf, sizeof(audit_buf),
+					"changing new_group=%s", group);
+				audit_logger (AUDIT_CHGRP_ID, Prog,
+					audit_buf, NULL, getuid (), 0);
+			} else
+				audit_logger (AUDIT_CHGRP_ID, Prog, "changing",
 				      NULL, getuid (), 0);
 #endif
 			exit (1);
@@ -531,14 +559,24 @@ int main (int argc, char **argv)
 	 * to the real UID. For root, this also sets the real GID to the
 	 * new group id.
 	 */
-	if (setgid (gid))
+	if (setgid (gid)) {
 		perror ("setgid");
+#ifdef WITH_AUDIT
+		snprintf (audit_buf, sizeof(audit_buf),
+			"changing new_gid=%d", gid);
+		audit_logger (AUDIT_CHGRP_ID, Prog,
+			audit_buf, NULL, getuid (), 0);
+#endif
+		exit (1);
+	}
 
 	if (setuid (getuid ())) {
 		perror ("setuid");
 #ifdef WITH_AUDIT
-		audit_logger (AUDIT_USER_START, Prog, "changing",
-			      NULL, getuid (), 0);
+		snprintf (audit_buf, sizeof(audit_buf),
+			"changing new_gid=%d", gid);
+		audit_logger (AUDIT_CHGRP_ID, Prog,
+			audit_buf, NULL, getuid (), 0);
 #endif
 		exit (1);
 	}
@@ -551,8 +589,10 @@ int main (int argc, char **argv)
 		closelog ();
 		execl ("/bin/sh", "sh", "-c", command, (char *) 0);
 #ifdef WITH_AUDIT
-		audit_logger (AUDIT_USER_START, Prog, "changing",
-			      NULL, getuid (), 0);
+		snprintf (audit_buf, sizeof(audit_buf),
+			"changing new_gid=%d", gid);
+		audit_logger (AUDIT_CHGRP_ID, Prog,
+			audit_buf, NULL, getuid (), 0);
 #endif
 		perror ("/bin/sh");
 		exit (errno == ENOENT ? E_CMD_NOTFOUND : E_CMD_NOEXEC);
@@ -618,7 +658,8 @@ int main (int argc, char **argv)
 	}
 
 #ifdef WITH_AUDIT
-	audit_logger (AUDIT_USER_START, Prog, "changing", NULL, getuid (), 1);
+	snprintf (audit_buf, sizeof(audit_buf), "changing new_gid=%d", gid);
+	audit_logger (AUDIT_CHGRP_ID, Prog, audit_buf, NULL, getuid (), 1);
 #endif
 	/*
 	 * Exec the login shell and go away. We are trying to get back to
@@ -641,7 +682,14 @@ int main (int argc, char **argv)
 	 */
 	closelog ();
 #ifdef WITH_AUDIT
-	audit_logger (AUDIT_USER_START, Prog, "changing", NULL, getuid (), 0);
+	if (group) {
+		snprintf (audit_buf, sizeof(audit_buf),
+			"changing new_group=%s", group);
+		audit_logger (AUDIT_CHGRP_ID, Prog, 
+			audit_buf, NULL, getuid (), 0);
+	} else
+		audit_logger (AUDIT_CHGRP_ID, Prog,
+			"changing", NULL, getuid (), 0);
 #endif
 	exit (1);
 }