diff options
author | ache <ache@FreeBSD.org> | 1999-04-24 17:17:42 +0000 |
---|---|---|
committer | ache <ache@FreeBSD.org> | 1999-04-24 17:17:42 +0000 |
commit | 1526baa9c80cbe657e4123bbb739ccfcc7b2ffce (patch) | |
tree | 622861ecc09492076f6311b167d36f2675a10b8e /lib/libutil | |
parent | 35ed42572623f74e60f7f78aa78d452ac4484bbc (diff) | |
download | FreeBSD-src-1526baa9c80cbe657e4123bbb739ccfcc7b2ffce.zip FreeBSD-src-1526baa9c80cbe657e4123bbb739ccfcc7b2ffce.tar.gz |
oops, add pwd!=NULL check to previous fix
Diffstat (limited to 'lib/libutil')
-rw-r--r-- | lib/libutil/login_cap.c | 28 |
1 files changed, 17 insertions, 11 deletions
diff --git a/lib/libutil/login_cap.c b/lib/libutil/login_cap.c index 8fee8dd..0e113aa 100644 --- a/lib/libutil/login_cap.c +++ b/lib/libutil/login_cap.c @@ -25,7 +25,7 @@ * * Low-level routines relating to the user capabilities database * - * $Id: login_cap.c,v 1.14 1997/06/13 22:26:41 davidn Exp $ + * $Id: login_cap.c,v 1.15 1999/04/24 17:01:58 ache Exp $ */ #include <stdio.h> @@ -184,8 +184,8 @@ login_getclassbyname(char const *name, const struct passwd *pwd) if ((lc = malloc(sizeof(login_cap_t))) != NULL) { int r, i = 0; - uid_t euid; - gid_t egid; + uid_t euid = 0; + gid_t egid = 0; const char *msg = NULL; const char *dir = (pwd == NULL) ? NULL : pwd->pw_dir; char userpath[MAXPATHLEN]; @@ -194,10 +194,12 @@ login_getclassbyname(char const *name, const struct passwd *pwd) /* Switch to user mode before checking/reading its ~/.login_conf */ /* - some NFSes have root read access disabled. */ - euid = geteuid(); - egid = getegid(); - (void)setegid(pwd->pw_gid); - (void)seteuid(pwd->pw_uid); + if (dir) { + euid = geteuid(); + egid = getegid(); + (void)setegid(pwd->pw_gid); + (void)seteuid(pwd->pw_uid); + } if (dir && snprintf(userpath, MAXPATHLEN, "%s/%s", dir, _FILE_LOGIN_CONF) < MAXPATHLEN) { @@ -238,8 +240,10 @@ login_getclassbyname(char const *name, const struct passwd *pwd) /* Fallthru - just return system defaults */ case 0: /* success! */ if ((lc->lc_class = strdup(name)) != NULL) { - (void)seteuid(euid); - (void)setegid(egid); + if (dir) { + (void)seteuid(euid); + (void)setegid(egid); + } ++lc_object_count; return lc; } @@ -258,8 +262,10 @@ login_getclassbyname(char const *name, const struct passwd *pwd) msg = "%s: unexpected cgetent() error '%s': %m"; break; } - (void)seteuid(euid); - (void)setegid(egid); + if (dir) { + (void)seteuid(euid); + (void)setegid(egid); + } if (msg != NULL) syslog(LOG_ERR, msg, "login_getclass", name); free(lc); |