changeset 4095:a2f4f9cfefe8

6549390 newgrp should really mean it when it says "Sorry"
author gww
date Tue, 24 Apr 2007 11:13:48 -0700
parents 3ade97212088
children a6833a0257cb
files usr/src/cmd/newgrp/newgrp.c
diffstat 1 files changed, 43 insertions(+), 36 deletions(-) [+]
line wrap: on
line diff
--- a/usr/src/cmd/newgrp/newgrp.c	Mon Apr 23 19:49:38 2007 -0700
+++ b/usr/src/cmd/newgrp/newgrp.c	Tue Apr 24 11:13:48 2007 -0700
@@ -20,7 +20,7 @@
  */
 
 /*
- * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
@@ -203,17 +203,11 @@
 	exit(1);
 }
 
-gid_t
-chkgrp(gname, p)
-char	*gname;
-struct	passwd *p;
+void
+put_event(char *gname, int sorf)
 {
-	char **t;
-	struct group *g;
-	gid_t	gid;
 	adt_session_data_t	*ah;
 	adt_event_data_t	*event;
-	int			sorf = ADT_SUCCESS;
 
 	if (adt_start_session(&ah, NULL, ADT_USE_PROC_DATA) != 0) {
 		syslog(LOG_AUTH | LOG_ALERT,
@@ -226,40 +220,53 @@
 		event->adt_newgrp_login.groupname = gname;
 	}
 
-	g = getgrnam(gname);
-	endgrent();
-	if (g == NULL) {
-		warn(UG);
-		gid = getgid();
-		goto audit;
-	}
-	gid = g->gr_gid;
-	if (p->pw_gid == g->gr_gid || getuid() == 0)
-		goto audit;
-	for (t = g->gr_mem; *t; ++t) {
-		if (strcmp(p->pw_name, *t) == 0)
-			goto audit;
-	}
-	if (*g->gr_passwd) {
-		if (!isatty(fileno(stdin))) {
-			error(PD);
-		}
-		if (strcmp(g->gr_passwd,
-		    crypt(getpassphrase(PW), g->gr_passwd)) == 0) {
-			goto audit;
-		}
-		sorf = ADT_FAILURE;
-	}
-	warn(NG);
-audit:
 	if (adt_put_event(event, sorf, sorf) != 0) {
 		syslog(LOG_AUTH | LOG_ALERT,
 		    "adt_put_event(ADT_newgrp, %d): %m", sorf);
 	}
 	adt_free_event(event);
 	(void) adt_end_session(ah);
+}
 
-	return (gid);
+gid_t
+chkgrp(gname, p)
+char	*gname;
+struct	passwd *p;
+{
+	char **t;
+	struct group *g;
+
+	g = getgrnam(gname);
+	endgrent();
+	if (g == NULL) {
+		warn(UG);
+		put_event(gname, ADT_FAILURE);
+		return (getgid());
+	}
+	if (p->pw_gid == g->gr_gid || getuid() == 0) {
+		put_event(gname, ADT_SUCCESS);
+		return (g->gr_gid);
+	}
+	for (t = g->gr_mem; *t; ++t) {
+		if (strcmp(p->pw_name, *t) == 0) {
+			put_event(gname, ADT_SUCCESS);
+			return (g->gr_gid);
+		}
+	}
+	if (*g->gr_passwd) {
+		if (!isatty(fileno(stdin))) {
+			put_event(gname, ADT_FAILURE);
+			error(PD);
+		}
+		if (strcmp(g->gr_passwd,
+		    crypt(getpassphrase(PW), g->gr_passwd)) == 0) {
+			put_event(gname, ADT_SUCCESS);
+			return (g->gr_gid);
+		}
+	}
+	put_event(gname, ADT_FAILURE);
+	warn(NG);
+	return (getgid());
 }
 
 void