summaryrefslogtreecommitdiff
path: root/usr/src/cmd/newgrp
diff options
context:
space:
mode:
authorgww <none@none>2007-04-24 11:13:48 -0700
committergww <none@none>2007-04-24 11:13:48 -0700
commit16cac7864bfb2afb3e274fea3fbaf50e8f154079 (patch)
tree6ce4bf6f583b8091883fbe816626fc22e7143e23 /usr/src/cmd/newgrp
parenta42f0d5fb05dc66ad6728c738208983ed951f6e4 (diff)
downloadillumos-joyent-16cac7864bfb2afb3e274fea3fbaf50e8f154079.tar.gz
6549390 newgrp should really mean it when it says "Sorry"
Diffstat (limited to 'usr/src/cmd/newgrp')
-rw-r--r--usr/src/cmd/newgrp/newgrp.c61
1 files changed, 34 insertions, 27 deletions
diff --git a/usr/src/cmd/newgrp/newgrp.c b/usr/src/cmd/newgrp/newgrp.c
index 5d6ee854be..580fb73512 100644
--- a/usr/src/cmd/newgrp/newgrp.c
+++ b/usr/src/cmd/newgrp/newgrp.c
@@ -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 @@ error(char *s)
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 @@ struct passwd *p;
event->adt_newgrp_login.groupname = gname;
}
+ 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);
+}
+
+gid_t
+chkgrp(gname, p)
+char *gname;
+struct passwd *p;
+{
+ char **t;
+ struct group *g;
+
g = getgrnam(gname);
endgrent();
if (g == NULL) {
warn(UG);
- gid = getgid();
- goto audit;
+ 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);
}
- 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 (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) {
- goto audit;
+ put_event(gname, ADT_SUCCESS);
+ return (g->gr_gid);
}
- sorf = ADT_FAILURE;
}
+ put_event(gname, 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);
+ return (getgid());
}
void