summaryrefslogtreecommitdiffstats
path: root/lib/libc
diff options
context:
space:
mode:
authorstas <stas@FreeBSD.org>2015-12-10 05:17:04 +0000
committerstas <stas@FreeBSD.org>2015-12-10 05:17:04 +0000
commit60361f83a82a106e15374eb64338c25112f46945 (patch)
tree249ba94738d6d197f628044fd83e0c376ecad49a /lib/libc
parent5e07a1262eca0e67e58f6727c9d97b63e5b66e0e (diff)
downloadFreeBSD-src-60361f83a82a106e15374eb64338c25112f46945.zip
FreeBSD-src-60361f83a82a106e15374eb64338c25112f46945.tar.gz
RPC: populate local address for rendezvous transporter.
When accepting a connection on underlying tcp socket rpc vc transporter fails to populate local address. This change rectifies this problem by modifying rendezvous_request() to fill out the xptr structure member with appropriate information. Submitted by: Alex Burlyga <alex.burlyga.ietf@gmail.com> MFC after: 2 weeks Differential Revision: https://reviews.freebsd.org/D4206
Diffstat (limited to 'lib/libc')
-rw-r--r--lib/libc/rpc/svc_vc.c18
1 files changed, 16 insertions, 2 deletions
diff --git a/lib/libc/rpc/svc_vc.c b/lib/libc/rpc/svc_vc.c
index bafb725..e81a839 100644
--- a/lib/libc/rpc/svc_vc.c
+++ b/lib/libc/rpc/svc_vc.c
@@ -281,8 +281,8 @@ rendezvous_request(SVCXPRT *xprt, struct rpc_msg *msg)
int sock, flags;
struct cf_rendezvous *r;
struct cf_conn *cd;
- struct sockaddr_storage addr;
- socklen_t len;
+ struct sockaddr_storage addr, sslocal;
+ socklen_t len, slen;
struct __rpc_sockinfo si;
SVCXPRT *newxprt;
fd_set cleanfds;
@@ -347,6 +347,20 @@ again:
__xdrrec_setnonblock(&cd->xdrs, cd->maxrec);
} else
cd->nonblock = FALSE;
+ slen = sizeof(struct sockaddr_storage);
+ if(_getsockname(sock, (struct sockaddr *)(void *)&sslocal, &slen) < 0) {
+ warnx("svc_vc_create: could not retrieve local addr");
+ newxprt->xp_ltaddr.maxlen = newxprt->xp_ltaddr.len = 0;
+ } else {
+ newxprt->xp_ltaddr.maxlen = newxprt->xp_ltaddr.len = sslocal.ss_len;
+ newxprt->xp_ltaddr.buf = mem_alloc((size_t)sslocal.ss_len);
+ if (newxprt->xp_ltaddr.buf == NULL) {
+ warnx("svc_vc_create: no mem for local addr");
+ newxprt->xp_ltaddr.maxlen = newxprt->xp_ltaddr.len = 0;
+ } else {
+ memcpy(newxprt->xp_ltaddr.buf, &sslocal, (size_t)sslocal.ss_len);
+ }
+ }
gettimeofday(&cd->last_recv_time, NULL);
OpenPOWER on IntegriCloud