Date: Fri, 1 Jun 2001 05:58:12 -0700 (PDT) From: Jean-Luc.Richier@imag.fr To: freebsd-gnats-submit@FreeBSD.org Subject: misc/27813: clnt_control option CLGET_SVC_ADDR does not work with rpc vc transport Message-ID: <200106011258.f51CwCD34619@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
>Number: 27813 >Category: misc >Synopsis: clnt_control option CLGET_SVC_ADDR does not work with rpc vc transport >Confidential: no >Severity: non-critical >Priority: medium >Responsible: freebsd-bugs >State: open >Quarter: >Keywords: >Date-Required: >Class: sw-bug >Submitter-Id: current-users >Arrival-Date: Fri Jun 01 06:00:02 PDT 2001 >Closed-Date: >Last-Modified: >Originator: Jean-Luc Richier >Release: FreeBSD5.0 current >Organization: IMAG >Environment: FreeBSD lagavulin.imag.fr 5.0-CURRENT FreeBSD 5.0-CURRENT #1 >Description: With the new TI-RPC libc code, the control call which allows clients to find the address of the server (clnt_control(clnt, CLGET_SVC_ADDR, ..) return an incorrect value. >How-To-Repeat: Consider the code at the end, which allows to test rpc calls (unicast or not) on different transports, compile it (cc -o tstrpc tstrpc.c) - on udp: it works: % tstrpc tuna.imag.fr response from: tuna.imag.fr - on tcp there is an error % tstrpc -t tuna.imag.fr incorrect response test program tstrpc.c: #include <netdb.h> #include <stdio.h> #include <unistd.h> #include <rpc/rpc.h> #define RPCBPROC_NULL 0 char *transp; int reply(caddr_t replyp, struct netbuf *raddrp, struct netconfig *nconf) { char host[NI_MAXHOST]; struct sockaddr *sock = raddrp->buf; if (getnameinfo(sock, sock->sa_len, host, sizeof (host), NULL, 0, 0)) printf("incorrect response\n"); else printf("response from: %s\n", host); return(0); } void onehost(char *host) { CLIENT *clnt; struct netbuf addr; struct timeval tv; if ((clnt = clnt_create(host, RPCBPROG, RPCBVERS, transp)) == NULL) errx(1, "%s", clnt_spcreateerror("")); tv.tv_sec = 15; tv.tv_usec = 0; if (clnt_call(clnt, RPCBPROC_NULL, xdr_void, NULL, xdr_void, NULL, tv) != RPC_SUCCESS) errx(1, "%s", clnt_sperror(clnt, "")); clnt_control(clnt, CLGET_SVC_ADDR, (char *)&addr); reply(NULL, &addr, NULL); } void allhosts() { enum clnt_stat clnt_stat; clnt_stat = rpc_broadcast(RPCBPROG, RPCBVERS, RPCBPROC_NULL, xdr_void, NULL, xdr_void, NULL, (resultproc_t)reply, transp); if (clnt_stat != RPC_SUCCESS && clnt_stat != RPC_TIMEDOUT) errx(1, "%s", clnt_sperrno(clnt_stat)); } int main(int argc, char *argv[]) { int ch; transp = "udp"; while ((ch = getopt(argc, argv, "ut")) != -1) switch (ch) { case 't': transp = "tcp"; break; case 'u': transp = "udp"; break; default: errx(1, "tstrpc -[u|t] ..."); } if (argc == optind) allhosts(); else for (; optind < argc; optind++) onehost(argv[optind]); exit(0); } >Fix: The problem is in lib/libc/rpc/clnt_vc.c, an incorrect reference. To correct: *** lib/libc/rpc/clnt_vc.c.DIST Wed Apr 4 01:34:45 2001 --- lib/libc/rpc/clnt_vc.c Mon May 7 17:35:30 2001 *************** *** 257,263 **** ct->ct_addr.buf = malloc(raddr->maxlen); if (ct->ct_addr.buf == NULL) goto err; ! memcpy(ct->ct_addr.buf, &raddr->buf, raddr->len); ct->ct_addr.len = raddr->maxlen; ct->ct_addr.maxlen = raddr->maxlen; --- 257,263 ---- ct->ct_addr.buf = malloc(raddr->maxlen); if (ct->ct_addr.buf == NULL) goto err; ! memcpy(ct->ct_addr.buf, raddr->buf, raddr->len); ct->ct_addr.len = raddr->maxlen; ct->ct_addr.maxlen = raddr->maxlen; >Release-Note: >Audit-Trail: >Unformatted: To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-bugs" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200106011258.f51CwCD34619>