diff options
| author | gww <none@none> | 2007-04-24 11:13:48 -0700 |
|---|---|---|
| committer | gww <none@none> | 2007-04-24 11:13:48 -0700 |
| commit | 16cac7864bfb2afb3e274fea3fbaf50e8f154079 (patch) | |
| tree | 6ce4bf6f583b8091883fbe816626fc22e7143e23 /usr/src/cmd/newgrp | |
| parent | a42f0d5fb05dc66ad6728c738208983ed951f6e4 (diff) | |
| download | illumos-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.c | 61 |
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 |
