From 5d2253d2dbb730c84248eeefa33ab6f1da4f55fce612b4e9af3f0eecdd4b2c52 Mon Sep 17 00:00:00 2001 From: OBS User buildservice-autocommit Date: Fri, 17 Sep 2010 22:53:13 +0000 Subject: [PATCH] Updating link to change in openSUSE:Factory/libtirpc revision 14.0 OBS-URL: https://build.opensuse.org/package/show/Base:System/libtirpc?expand=0&rev=52b49edbc74959ad491aa81833a0bd24 --- libtirpc-getpmaphandle.patch | 101 +++++++++++++++++++++++++++++ libtirpc-pmap-setunset.patch | 120 +++++++++++++++++++++++++++++++++++ libtirpc.changes | 8 +++ libtirpc.spec | 6 +- 4 files changed, 234 insertions(+), 1 deletion(-) create mode 100644 libtirpc-getpmaphandle.patch create mode 100644 libtirpc-pmap-setunset.patch diff --git a/libtirpc-getpmaphandle.patch b/libtirpc-getpmaphandle.patch new file mode 100644 index 0000000..0825c26 --- /dev/null +++ b/libtirpc-getpmaphandle.patch @@ -0,0 +1,101 @@ +commit 258824b705df18d171eaf072cfda692504e3649e +Author: Olaf Kirch +Date: Mon Aug 23 12:58:41 2010 +0200 + + Introduce new helper function getpmaphandle + + This moves some code for creation of PMAP handles out of the getaddr + code and into a function of its own. + + Signed-off-by: Olaf Kirch + +diff --git a/src/rpcb_clnt.c b/src/rpcb_clnt.c +index a800128..962d9c7 100644 +--- a/src/rpcb_clnt.c ++++ b/src/rpcb_clnt.c +@@ -434,6 +434,44 @@ out_err: + return (client); + } + ++/* ++ * Create a PMAP client handle. ++ */ ++static CLIENT * ++getpmaphandle(nconf, hostname, tgtaddr) ++ const struct netconfig *nconf; ++ const char *hostname; ++ char **tgtaddr; ++{ ++ CLIENT *client = NULL; ++ rpcvers_t pmapvers = 2; ++ ++ /* ++ * Try UDP only - there are some portmappers out ++ * there that use UDP only. ++ */ ++ if (nconf == NULL || strcmp(nconf->nc_proto, NC_TCP) == 0) { ++ struct netconfig *newnconf; ++ ++ if ((newnconf = getnetconfigent("udp")) == NULL) { ++ rpc_createerr.cf_stat = RPC_UNKNOWNPROTO; ++ return NULL; ++ } ++ client = getclnthandle(hostname, newnconf, tgtaddr); ++ freenetconfigent(newnconf); ++ } else if (strcmp(nconf->nc_proto, NC_UDP) == 0) { ++ if (strcmp(nconf->nc_protofmly, NC_INET) != 0) ++ return NULL; ++ client = getclnthandle(hostname, nconf, tgtaddr); ++ } ++ ++ /* Set version */ ++ if (client != NULL) ++ CLNT_CONTROL(client, CLSET_VERS, (char *)&pmapvers); ++ ++ return client; ++} ++ + /* XXX */ + #define IN4_LOCALHOST_STRING "127.0.0.1" + #define IN6_LOCALHOST_STRING "::1" +@@ -770,34 +808,20 @@ __rpcb_findaddr_timed(program, version, nconf, host, clpp, tp) + if (strcmp(nconf->nc_protofmly, NC_INET) == 0) { + u_short port = 0; + struct netbuf remote; +- rpcvers_t pmapvers = 2; + struct pmap pmapparms; + +- /* +- * Try UDP only - there are some portmappers out +- * there that use UDP only. +- */ +- if (strcmp(nconf->nc_proto, NC_TCP) == 0) { +- struct netconfig *newnconf; +- +- if ((newnconf = getnetconfigent("udp")) == NULL) { +- rpc_createerr.cf_stat = RPC_UNKNOWNPROTO; +- return (NULL); +- } +- client = getclnthandle(host, newnconf, &parms.r_addr); +- freenetconfigent(newnconf); +- } else if (strcmp(nconf->nc_proto, NC_UDP) == 0) +- client = getclnthandle(host, nconf, &parms.r_addr); +- else ++ if (strcmp(nconf->nc_proto, NC_UDP) != 0 ++ && strcmp(nconf->nc_proto, NC_TCP) != 0) + goto try_rpcbind; ++ ++ client = getpmaphandle(nconf, IN4_LOCALHOST_STRING, &parms.r_addr); + if (client == NULL) + return (NULL); + + /* +- * Set version and retry timeout. ++ * Set retry timeout. + */ + CLNT_CONTROL(client, CLSET_RETRY_TIMEOUT, (char *)&rpcbrmttime); +- CLNT_CONTROL(client, CLSET_VERS, (char *)&pmapvers); + + pmapparms.pm_prog = program; + pmapparms.pm_vers = version; + diff --git a/libtirpc-pmap-setunset.patch b/libtirpc-pmap-setunset.patch new file mode 100644 index 0000000..50a9362 --- /dev/null +++ b/libtirpc-pmap-setunset.patch @@ -0,0 +1,120 @@ +commit 30feadb3ae5a8d001aabc44f8ddad44298ec61a2 +Author: Olaf Kirch +Date: Mon Aug 23 14:36:13 2010 +0200 + + pmap_set/unset: allow compat functions to work with old-style portmap + + This change fixes a bug when running applications compiled against + libtirpc on a host with old-style portmap. Without this change, the + pmap_set/pmap_unset compatibility functions will actually be mapped + to a RPCB_SET/UNSET call. If the server does not support anything more + recent than PMAP, the operations will fail completely. + + This fix makes pmap_set/unset try the old portmapper functions + first, and if those fail, try to fall back to the new rpcbind + interface. + + Signed-off-by: Olaf Kirch + +diff --git a/src/pmap_clnt.c b/src/pmap_clnt.c +index 1d5d153..24cf94a 100644 +--- a/src/pmap_clnt.c ++++ b/src/pmap_clnt.c +@@ -58,6 +58,10 @@ pmap_set(u_long program, u_long version, int protocol, int port) + struct netconfig *nconf; + char buf[32]; + ++#ifdef PORTMAP ++ if (__pmap_set(program, version, protocol, port)) ++ return (TRUE); ++#endif + if ((protocol != IPPROTO_UDP) && (protocol != IPPROTO_TCP)) { + return (FALSE); + } +@@ -89,6 +93,11 @@ pmap_unset(u_long program, u_long version) + bool_t udp_rslt = FALSE; + bool_t tcp_rslt = FALSE; + ++#ifdef PORTMAP ++ if (__pmap_set(program, version, IPPROTO_UDP, 0) ++ && __pmap_set(program, version, IPPROTO_TCP, 0)) ++ return (TRUE); ++#endif + nconf = __rpc_getconfip("udp"); + if (nconf != NULL) { + udp_rslt = rpcb_unset((rpcprog_t)program, (rpcvers_t)version, +diff --git a/src/rpc_com.h b/src/rpc_com.h +index 38c2cfe..0a20a01 100644 +--- a/src/rpc_com.h ++++ b/src/rpc_com.h +@@ -86,6 +86,9 @@ bool_t __xdrrec_getrec(XDR *, enum xprt_stat *, bool_t); + void __xprt_unregister_unlocked(SVCXPRT *); + void __xprt_set_raddr(SVCXPRT *, const struct sockaddr_storage *); + ++#ifdef PORTMAP ++bool_t __pmap_set(rpcprog_t, rpcvers_t, int protocol, int port); ++#endif + + SVCXPRT **__svc_xports; + int __svc_maxrec; +diff --git a/src/rpcb_clnt.c b/src/rpcb_clnt.c +index 531c619..9562646 100644 +--- a/src/rpcb_clnt.c ++++ b/src/rpcb_clnt.c +@@ -476,6 +476,55 @@ getpmaphandle(nconf, hostname, tgtaddr) + #define IN4_LOCALHOST_STRING "127.0.0.1" + #define IN6_LOCALHOST_STRING "::1" + ++#ifdef PORTMAP ++/* ++ * Perform a PMAP_SET or PMAP_UNSET call to the ++ * local rpcbind/portmap service. ++ */ ++bool_t ++__pmap_set(program, version, protocol, port) ++ rpcprog_t program; ++ rpcvers_t version; ++ int protocol; ++ int port; ++{ ++ CLIENT *client; ++ rpcproc_t pmapproc; ++ struct pmap pmapparms; ++ bool_t rslt = FALSE; ++ enum clnt_stat clnt_st; ++ ++ /* Arguments should already have been checked by caller */ ++ ++ pmapproc = port? PMAPPROC_SET : PMAPPROC_UNSET; ++ pmapparms.pm_prog = program; ++ pmapparms.pm_vers = version; ++ pmapparms.pm_prot = protocol; ++ pmapparms.pm_port = port; ++ ++ client = getpmaphandle(NULL, IN4_LOCALHOST_STRING, NULL); ++ if (client == NULL) ++ return (FALSE); ++ ++ clnt_st = CLNT_CALL(client, pmapproc, ++ (xdrproc_t) xdr_pmap, (caddr_t)(void *) &pmapparms, ++ (xdrproc_t) xdr_bool, (caddr_t)(void *) &rslt, ++ tottimeout); ++ ++ if (clnt_st == RPC_SUCCESS) ++ return rslt; ++ ++ if (clnt_st != RPC_PROGVERSMISMATCH && ++ clnt_st != RPC_PROGUNAVAIL) { ++ rpc_createerr.cf_stat = RPC_PMAPFAILURE; ++ clnt_geterr(client, &rpc_createerr.cf_error); ++ return (FALSE); ++ } ++ ++ return (TRUE); ++} ++#endif ++ + /* + * This routine will return a client handle that is connected to the local + * rpcbind. Returns NULL on error and free's everything. + diff --git a/libtirpc.changes b/libtirpc.changes index 16c9322..73cf7b3 100644 --- a/libtirpc.changes +++ b/libtirpc.changes @@ -1,3 +1,11 @@ +------------------------------------------------------------------- +Wed Sep 15 14:38:57 UTC 2010 - max@novell.com + +- Fix interoperability of libtirpc with the old portmapper: + * Add libtirpc-getpmaphandle.patch + * Add libtirpc-pmap-setunset.patch + * bnc#633007 + ------------------------------------------------------------------- Thu May 27 21:01:20 UTC 2010 - cristian.rodriguez@opensuse.org diff --git a/libtirpc.spec b/libtirpc.spec index 58b2264..b740abf 100644 --- a/libtirpc.spec +++ b/libtirpc.spec @@ -24,12 +24,14 @@ License: Other uncritical OpenSource License ; Sun Industry Standards Sou Group: System/Libraries AutoReqProv: on Version: 0.2.1_git201005272057 -Release: 1 +Release: 2 Summary: Transport Independent RPC Library Url: http://sourceforge.net/projects/libtirpc/ Source: %{name}-%{version}.tar.bz2 Patch21: libtirpc-clnt_broadcast_fix.patch Patch22: libtirpc-rpc_broadcast_misformed_replies.patch +Patch31: libtirpc-getpmaphandle.patch +Patch32: libtirpc-pmap-setunset.patch BuildRoot: %{_tmppath}/%{name}-%{version}-build %define debug_package_requires libtirpc1 = %{version}-%{release} @@ -87,6 +89,8 @@ Authors: %setup -q %patch21 -p1 %patch22 -p1 +%patch31 -p1 +%patch32 -p1 %build mkdir m4 #bug