diff options
-rw-r--r-- | include/rpc/svc.h | 5 | ||||
-rw-r--r-- | lib/libc/rpc/svc_vc.c | 143 |
2 files changed, 21 insertions, 127 deletions
diff --git a/include/rpc/svc.h b/include/rpc/svc.h index e62c84d..7ecae0c 100644 --- a/include/rpc/svc.h +++ b/include/rpc/svc.h @@ -144,11 +144,6 @@ struct svc_req { #define svc_getrpccaller(x) (&(x)->xp_rtaddr) /* - * FreeBSD-only definition to get the creds of the caller (AF_LOCAL). - */ -#define __svc_getcallercreds(x) ((struct cmsgcred *)(x)->xp_p2) - -/* * Operations defined on an SVCXPRT handle * * SVCXPRT *xprt; diff --git a/lib/libc/rpc/svc_vc.c b/lib/libc/rpc/svc_vc.c index 259527f..99e6af1 100644 --- a/lib/libc/rpc/svc_vc.c +++ b/lib/libc/rpc/svc_vc.c @@ -70,11 +70,6 @@ __FBSDID("$FreeBSD$"); #include "rpc_com.h" #include "un-namespace.h" -struct cmessage { - struct cmsghdr cmsg; - struct cmsgcred cmcred; -}; - extern rwlock_t svc_fd_lock; static SVCXPRT *makefd_xprt(int, u_int, u_int); @@ -94,7 +89,6 @@ static void svc_vc_ops(SVCXPRT *); static bool_t svc_vc_control(SVCXPRT *xprt, const u_int rq, void *in); static bool_t svc_vc_rendezvous_control (SVCXPRT *xprt, const u_int rq, void *in); -static int __msgread_withcred(int, void *, size_t, struct cmessage *); static int __msgwrite(int, void *, size_t); struct cf_rendezvous { /* kept in xprt->xp_p1 for rendezvouser */ @@ -476,8 +470,6 @@ read_vc(xprtp, buf, len) int sock; int milliseconds = 35 * 1000; struct pollfd pollfd; - struct sockaddr *sa; - struct cmessage *cm; struct cf_conn *cfp; xprt = (SVCXPRT *)xprtp; @@ -487,15 +479,8 @@ read_vc(xprtp, buf, len) cfp = (struct cf_conn *)xprt->xp_p1; - cm = NULL; - sa = (struct sockaddr *)xprt->xp_rtaddr.buf; if (cfp->nonblock) { - if (sa->sa_family == AF_LOCAL) { - cm = (struct cmessage *)xprt->xp_verf.oa_base; - if ((len = __msgread_withcred(sock, buf, len, cm)) > 0) - xprt->xp_p2 = &cm->cmcred; - } else - len = _read(sock, buf, (size_t)len); + len = _read(sock, buf, (size_t)len); if (len < 0) { if (errno == EAGAIN) len = 0; @@ -524,18 +509,9 @@ read_vc(xprtp, buf, len) } } while ((pollfd.revents & POLLIN) == 0); - if (sa->sa_family == AF_LOCAL) { - cm = (struct cmessage *)xprt->xp_verf.oa_base; - if ((len = __msgread_withcred(sock, buf, len, cm)) > 0) { - xprt->xp_p2 = &cm->cmcred; - return (len); - } else - goto fatal_err; - } else { - if ((len = _read(sock, buf, (size_t)len)) > 0) { - gettimeofday(&cfp->last_recv_time, NULL); - return (len); - } + if ((len = _read(sock, buf, (size_t)len)) > 0) { + gettimeofday(&cfp->last_recv_time, NULL); + return (len); } fatal_err: @@ -555,7 +531,6 @@ write_vc(xprtp, buf, len) { SVCXPRT *xprt; int i, cnt; - struct sockaddr *sa; struct cf_conn *cd; struct timeval tv0, tv1; @@ -567,12 +542,8 @@ write_vc(xprtp, buf, len) if (cd->nonblock) gettimeofday(&tv0, NULL); - sa = (struct sockaddr *)xprt->xp_rtaddr.buf; for (cnt = len; cnt > 0; cnt -= i, buf += i) { - if (sa->sa_family == AF_LOCAL) - i = __msgwrite(xprt->xp_fd, buf, (size_t)cnt); - else - i = _write(xprt->xp_fd, buf, (size_t)cnt); + i = _write(xprt->xp_fd, buf, (size_t)cnt); if (i < 0) { if (errno != EAGAIN || !cd->nonblock) { cd->strm_stat = XPRT_DIED; @@ -747,98 +718,26 @@ svc_vc_rendezvous_ops(xprt) mutex_unlock(&ops_lock); } -int -__msgread_withcred(sock, buf, cnt, cmp) - int sock; - void *buf; - size_t cnt; - struct cmessage *cmp; -{ - struct iovec iov[1]; - struct msghdr msg; - union { - struct cmsghdr cmsg; - char control[CMSG_SPACE(sizeof(struct cmsgcred))]; - } cm; - int ret; - - - bzero(&cm, sizeof(cm)); - iov[0].iov_base = buf; - iov[0].iov_len = cnt; - - msg.msg_iov = iov; - msg.msg_iovlen = 1; - msg.msg_name = NULL; - msg.msg_namelen = 0; - msg.msg_control = &cm; - msg.msg_controllen = CMSG_SPACE(sizeof(struct cmsgcred)); - msg.msg_flags = 0; - - ret = _recvmsg(sock, &msg, 0); - bcopy(&cm.cmsg, &cmp->cmsg, sizeof(cmp->cmsg)); - bcopy(CMSG_DATA(&cm), &cmp->cmcred, sizeof(cmp->cmcred)); - - if ((msg.msg_flags & MSG_CTRUNC) != 0) - return (-1); - - return (ret); -} - -static int -__msgwrite(sock, buf, cnt) - int sock; - void *buf; - size_t cnt; -{ - struct iovec iov[1]; - struct msghdr msg; - struct cmessage cm; - - bzero((char *)&cm, sizeof(cm)); - iov[0].iov_base = buf; - iov[0].iov_len = cnt; - - cm.cmsg.cmsg_type = SCM_CREDS; - cm.cmsg.cmsg_level = SOL_SOCKET; - cm.cmsg.cmsg_len = sizeof(struct cmessage); - - msg.msg_iov = iov; - msg.msg_iovlen = 1; - msg.msg_name = NULL; - msg.msg_namelen = 0; - msg.msg_control = &cm; - msg.msg_controllen = sizeof(struct cmessage); - msg.msg_flags = 0; - - return(_sendmsg(sock, &msg, 0)); -} - /* - * Get the effective UID of the sending process. Used by rpcbind and keyserv - * (AF_LOCAL). + * Get the effective UID of the sending process. Used by rpcbind, keyserv + * and rpc.yppasswdd on AF_LOCAL. */ int -__rpc_get_local_uid(SVCXPRT *transp, uid_t *uid) -{ - struct cmsgcred *cmcred; - struct cmessage *cm; - struct cmsghdr *cmp; - - cm = (struct cmessage *)transp->xp_verf.oa_base; - - if (cm == NULL) - return (-1); - cmp = &cm->cmsg; - if (cmp == NULL || cmp->cmsg_level != SOL_SOCKET || - cmp->cmsg_type != SCM_CREDS) +__rpc_get_local_uid(SVCXPRT *transp, uid_t *uid) { + int sock, ret; + gid_t egid; + uid_t euid; + struct sockaddr *sa; + + sock = transp->xp_fd; + sa = (struct sockaddr *)transp->xp_rtaddr.buf; + if (sa->sa_family == AF_LOCAL) { + ret = getpeereid(sock, &euid, &egid); + if (ret == 0) + *uid = euid; + return (ret); + } else return (-1); - - cmcred = __svc_getcallercreds(transp); - if (cmcred == NULL) - return (-1); - *uid = cmcred->cmcred_euid; - return (0); } /* |