From 643b6c0ae7a66a3e1f832edc9a989b82db56c190012290ba96eed7b047f68e23 Mon Sep 17 00:00:00 2001 From: Dirk Mueller Date: Thu, 16 Sep 2010 14:56:36 +0000 Subject: [PATCH 1/3] Accepting request 48222 from home:rmax:branches:Base:System OBS-URL: https://build.opensuse.org/request/show/48222 OBS-URL: https://build.opensuse.org/package/show/Base:System/libtirpc?expand=0&rev=8 --- libtirpc-getpmaphandle.patch | 101 +++++++++++++++++++++++++++++ libtirpc-pmap-setunset.patch | 120 +++++++++++++++++++++++++++++++++++ libtirpc.changes | 8 +++ libtirpc.spec | 4 ++ 4 files changed, 233 insertions(+) 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..e9b7d10 100644 --- a/libtirpc.spec +++ b/libtirpc.spec @@ -30,6 +30,8 @@ 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 From 7dfc62e739fa60ca3f8e6e7cba02d163f5d3774f652c5219c62a1e8222752023 Mon Sep 17 00:00:00 2001 From: OBS User autobuild Date: Fri, 17 Sep 2010 22:53:12 +0000 Subject: [PATCH 2/3] Accepting request 48317 from Base:System checked in (request 48317) OBS-URL: https://build.opensuse.org/request/show/48317 OBS-URL: https://build.opensuse.org/package/show/Base:System/libtirpc?expand=0&rev=9 --- libtirpc-getpmaphandle.patch | 101 ----------------------------- libtirpc-pmap-setunset.patch | 120 ----------------------------------- libtirpc.changes | 8 --- libtirpc.spec | 4 -- 4 files changed, 233 deletions(-) delete mode 100644 libtirpc-getpmaphandle.patch delete mode 100644 libtirpc-pmap-setunset.patch diff --git a/libtirpc-getpmaphandle.patch b/libtirpc-getpmaphandle.patch deleted file mode 100644 index 0825c26..0000000 --- a/libtirpc-getpmaphandle.patch +++ /dev/null @@ -1,101 +0,0 @@ -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 deleted file mode 100644 index 50a9362..0000000 --- a/libtirpc-pmap-setunset.patch +++ /dev/null @@ -1,120 +0,0 @@ -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 73cf7b3..16c9322 100644 --- a/libtirpc.changes +++ b/libtirpc.changes @@ -1,11 +1,3 @@ -------------------------------------------------------------------- -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 e9b7d10..58b2264 100644 --- a/libtirpc.spec +++ b/libtirpc.spec @@ -30,8 +30,6 @@ 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} @@ -89,8 +87,6 @@ Authors: %setup -q %patch21 -p1 %patch22 -p1 -%patch31 -p1 -%patch32 -p1 %build mkdir m4 #bug 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 3/3] 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