X-Git-Url: https://git.saurik.com/apple/libinfo.git/blobdiff_plain/ad21edcc50f98a2a0f674a569817952d671962c6..9e8ccf68ea9492d257074b9d3023cf906c5dfeda:/util.subproj/rcmd.c diff --git a/util.subproj/rcmd.c b/util.subproj/rcmd.c index 8472938..464250f 100644 --- a/util.subproj/rcmd.c +++ b/util.subproj/rcmd.c @@ -66,9 +66,7 @@ static char sccsid[] = "@(#)rcmd.c 8.3 (Berkeley) 3/26/94"; #include #include -#include #include -#include #include #include @@ -79,12 +77,15 @@ static char sccsid[] = "@(#)rcmd.c 8.3 (Berkeley) 3/26/94"; #include #include #include +#include #ifdef YP #include #include #include #endif -#include + +#include +#include /* wrapper for KAME-special getnameinfo() */ #ifndef NI_WITHSCOPEID @@ -234,7 +235,7 @@ rcmd_af(ahost, rport, locuser, remuser, cmd, fd2p, af) } else { char num[8]; int s2 = rresvport_af(&lport, ai->ai_family), s3; - int len = ai->ai_addrlen; + unsigned int len = ai->ai_addrlen; int nfds; if (s2 < 0) @@ -404,6 +405,9 @@ rresvport_af(alport, family) int __check_rhosts_file = 1; char *__rcmd_errstr; +/* Guess at the size of a password buffer for getpwnam_r (see lookup.subproj/lu_group.c) */ +#define MAXPWBUF (MAXLOGNAME + 1 + _PASSWORD_LEN + 1 + MAXPATHLEN + 1 + MAXPATHLEN + 1 + 4098) + /* * AF independent extension of iruserok. * @@ -418,13 +422,14 @@ iruserok_sa(ra, rlen, superuser, ruser, luser) { register char *cp; struct stat sbuf; - struct passwd *pwd; + struct passwd p, *pwd; FILE *hostf; uid_t uid; - int first; + int first, status; char pbuf[MAXPATHLEN]; const struct sockaddr *raddr; struct sockaddr_storage ss; + char pwbuf[MAXPWBUF]; /* avoid alignment issue */ if (rlen > sizeof(ss)) @@ -444,8 +449,14 @@ again: } if (first == 1 && (__check_rhosts_file || superuser)) { first = 0; - if ((pwd = getpwnam(luser)) == NULL) - return (-1); + + memset(&p, 0, sizeof(struct passwd)); + memset(pwbuf, 0, sizeof(pwbuf)); + pwd = NULL; + + status = getpwnam_r(luser, &p, pwbuf, MAXPWBUF, &pwd); + if (status != 0) return -1; + (void)strcpy(pbuf, pwd->pw_dir); (void)strcat(pbuf, "/.rhosts");