diff options
author | svn2git <svn2git@FreeBSD.org> | 1994-07-01 08:00:00 +0000 |
---|---|---|
committer | svn2git <svn2git@FreeBSD.org> | 1994-07-01 08:00:00 +0000 |
commit | 5e0e9b99dc3fc0ecd49d929db0d57c784b66f481 (patch) | |
tree | e779b5a6edddbb949b7990751b12d6f25304ba86 /lib/libc/net | |
parent | a16f65c7d117419bd266c28a1901ef129a337569 (diff) |
Diffstat (limited to 'lib/libc/net')
-rw-r--r-- | lib/libc/net/gethostnamadr.c | 1 | ||||
-rw-r--r-- | lib/libc/net/ns_addr.c | 4 | ||||
-rw-r--r-- | lib/libc/net/rcmd.c | 30 |
3 files changed, 30 insertions, 5 deletions
diff --git a/lib/libc/net/gethostnamadr.c b/lib/libc/net/gethostnamadr.c index 2b1597a20796..b4c154672d58 100644 --- a/lib/libc/net/gethostnamadr.c +++ b/lib/libc/net/gethostnamadr.c @@ -120,6 +120,7 @@ init_services() service_order[cc++] = SERVICE_NIS; } service_order[cc] = SERVICE_NONE; + fclose(fd); } service_done = 1; } diff --git a/lib/libc/net/ns_addr.c b/lib/libc/net/ns_addr.c index e31e6d13570f..684dd8e79165 100644 --- a/lib/libc/net/ns_addr.c +++ b/lib/libc/net/ns_addr.c @@ -55,8 +55,8 @@ ns_addr(name) char *hostname, *socketname, *cp; char buf[50]; - (void)strncpy(buf, name, sizeof(buf - 1)); - buf[sizeof(buf - 1)] = '\0'; + (void)strncpy(buf, name, sizeof(buf) - 1); + buf[sizeof(buf) - 1] = '\0'; /* * First, figure out what he intends as a field separtor. diff --git a/lib/libc/net/rcmd.c b/lib/libc/net/rcmd.c index d0cd18000ba9..5d1a575fe110 100644 --- a/lib/libc/net/rcmd.c +++ b/lib/libc/net/rcmd.c @@ -38,6 +38,7 @@ static char sccsid[] = "@(#)rcmd.c 5.24 (Berkeley) 2/24/91"; #include <sys/param.h> #include <sys/socket.h> #include <sys/stat.h> +#include <sys/types.h> #include <netinet/in.h> #include <arpa/inet.h> #include <signal.h> @@ -138,7 +139,7 @@ rcmd(ahost, rport, locuser, remuser, cmd, fd2p) FD_SET(s, &reads); FD_SET(s2, &reads); errno = 0; - if (select(32, &reads, 0, 0, 0) < 1 || + if (select(FD_SETSIZE, &reads, 0, 0, 0) < 1 || !FD_ISSET(s2, &reads)) { if (errno != 0) perror("select: setting up stderr"); @@ -230,6 +231,12 @@ ruserok(rhost, superuser, ruser, luser) int first = 1; register char *sp, *p; int baselen = -1; + uid_t suid; + gid_t sgid; + int int_sgid; /* this is a kludge and should be removed + when we transition to FreeBSD 2.0. If you + find this code in a 2.0 source tree, please + contact the core team. */ sp = (char *)rhost; p = fhost; @@ -248,6 +255,12 @@ again: if (hostf) { if (!_validuser(hostf, fhost, luser, ruser, baselen)) { (void) fclose(hostf); + if (first == 0) { + (void)seteuid(suid); + (void)setegid(sgid); + int_sgid = sgid; + (void)setgroups(1, &int_sgid); + } return(0); } (void) fclose(hostf); @@ -258,12 +271,17 @@ again: char pbuf[MAXPATHLEN]; first = 0; + suid = geteuid(); + sgid = getegid(); if ((pwd = getpwnam(luser)) == NULL) return(-1); + (void)setegid(pwd->pw_gid); + (void)initgroups(luser, pwd->pw_gid); + (void)seteuid(pwd->pw_uid); (void)strcpy(pbuf, pwd->pw_dir); (void)strcat(pbuf, "/.rhosts"); if ((hostf = fopen(pbuf, "r")) == NULL) - return(-1); + goto bad; /* * if owned by someone other than user or root or if * writeable by anyone but the owner, quit @@ -272,10 +290,16 @@ again: sbuf.st_uid && sbuf.st_uid != pwd->pw_uid || sbuf.st_mode&022) { fclose(hostf); - return(-1); + goto bad; } goto again; } +bad: + if (first == 0) { + (void)seteuid(suid); + (void)setegid(sgid); + (void)setgroups(1, (int *)&sgid); + } return (-1); } |