+++ /dev/null
-diff --git a/src/clnt_perror.c b/src/clnt_perror.c
-index e46d95f..8f53f8e 100644
---- a/src/clnt_perror.c
-+++ b/src/clnt_perror.c
-@@ -36,7 +36,6 @@
- * Copyright (C) 1984, Sun Microsystems, Inc.
- *
- */
--#include <assert.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
-@@ -75,8 +74,8 @@ clnt_sperror(rpch, s)
- char *strstart;
- size_t len, i;
-
-- assert(rpch != NULL);
-- assert(s != NULL);
-+ if (rpch == NULL || s == NULL)
-+ return(0);
-
- str = _buf(); /* side effect: sets CLNT_PERROR_BUFLEN */
- if (str == 0)
-@@ -85,7 +84,8 @@ clnt_sperror(rpch, s)
- strstart = str;
- CLNT_GETERR(rpch, &e);
-
-- if ((i = snprintf(str, len, "%s: ", s)) > 0) {
-+ if (snprintf(str, len, "%s: ", s) > 0) {
-+ i = strlen(str);
- str += i;
- len -= i;
- }
-@@ -113,7 +113,8 @@ clnt_sperror(rpch, s)
-
- case RPC_CANTSEND:
- case RPC_CANTRECV:
-- i = snprintf(str, len, "; errno = %s", strerror(e.re_errno));
-+ snprintf(str, len, "; errno = %s", strerror(e.re_errno));
-+ i = strlen(str);
- if (i > 0) {
- str += i;
- len -= i;
-@@ -121,8 +122,9 @@ clnt_sperror(rpch, s)
- break;
-
- case RPC_VERSMISMATCH:
-- i = snprintf(str, len, "; low version = %u, high version = %u",
-+ snprintf(str, len, "; low version = %u, high version = %u",
- e.re_vers.low, e.re_vers.high);
-+ i = strlen(str);
- if (i > 0) {
- str += i;
- len -= i;
-@@ -131,18 +133,20 @@ clnt_sperror(rpch, s)
-
- case RPC_AUTHERROR:
- err = auth_errmsg(e.re_why);
-- i = snprintf(str, len, "; why = ");
-+ snprintf(str, len, "; why = ");
-+ i = strlen(str);
- if (i > 0) {
- str += i;
- len -= i;
- }
- if (err != NULL) {
-- i = snprintf(str, len, "%s",err);
-+ snprintf(str, len, "%s",err);
- } else {
-- i = snprintf(str, len,
-+ snprintf(str, len,
- "(unknown authentication error - %d)",
- (int) e.re_why);
- }
-+ i = strlen(str);
- if (i > 0) {
- str += i;
- len -= i;
-@@ -150,8 +154,9 @@ clnt_sperror(rpch, s)
- break;
-
- case RPC_PROGVERSMISMATCH:
-- i = snprintf(str, len, "; low version = %u, high version = %u",
-+ snprintf(str, len, "; low version = %u, high version = %u",
- e.re_vers.low, e.re_vers.high);
-+ i = strlen(str);
- if (i > 0) {
- str += i;
- len -= i;
-@@ -159,8 +164,9 @@ clnt_sperror(rpch, s)
- break;
-
- default: /* unknown */
-- i = snprintf(str, len, "; s1 = %u, s2 = %u",
-+ snprintf(str, len, "; s1 = %u, s2 = %u",
- e.re_lb.s1, e.re_lb.s2);
-+ i = strlen(str);
- if (i > 0) {
- str += i;
- len -= i;
-@@ -177,8 +183,8 @@ clnt_perror(rpch, s)
- const char *s;
- {
-
-- assert(rpch != NULL);
-- assert(s != NULL);
-+ if (rpch == NULL || s == NULL)
-+ return;
-
- (void) fprintf(stderr, "%s\n", clnt_sperror(rpch,s));
- }
-@@ -236,13 +242,15 @@ clnt_spcreateerror(s)
- char *str;
- size_t len, i;
-
-- assert(s != NULL);
-+ if (s == NULL)
-+ return(0);
-
- str = _buf(); /* side effect: sets CLNT_PERROR_BUFLEN */
- if (str == 0)
- return(0);
- len = CLNT_PERROR_BUFLEN;
-- i = snprintf(str, len, "%s: ", s);
-+ snprintf(str, len, "%s: ", s);
-+ i = strlen(str);
- if (i > 0)
- len -= i;
- (void)strncat(str, clnt_sperrno(rpc_createerr.cf_stat), len - 1);
-@@ -287,7 +295,8 @@ clnt_pcreateerror(s)
- const char *s;
- {
-
-- assert(s != NULL);
-+ if (s == NULL)
-+ return;
-
- (void) fprintf(stderr, "%s\n", clnt_spcreateerror(s));
- }
+++ /dev/null
---- libtirpc-0.1.7/src/Makefile.am.orig 2006-08-11 11:50:28.000000000 -0400
-+++ libtirpc-0.1.7/src/Makefile.am 2006-08-11 12:48:29.000000000 -0400
-@@ -29,8 +29,8 @@ libtirpc_la_SOURCES += xdr.c xdr_rec.c x
- ## Secure-RPC
- if GSS
- libtirpc_la_SOURCES += auth_gss.c authgss_prot.c svc_auth_gss.c
-- libtirpc_la_LDFLAGS += -lgssapi
-- libtirpc_la_CFLAGS = -DHAVE_RPCSEC_GSS
-+ libtirpc_la_LDFLAGS += $(GSSAPI_LIBS)
-+ libtirpc_la_CFLAGS = -DHAVE_RPCSEC_GSS $(GSSAPI_CFLAGS)
- endif
-
- ## libtirpc_a_SOURCES += key_call.c key_prot_xdr.c getpublickey.c
---- libtirpc-0.1.7/configure.in.orig 2006-08-11 11:48:36.000000000 -0400
-+++ libtirpc-0.1.7/configure.in 2006-08-11 12:07:15.000000000 -0400
-@@ -10,6 +10,10 @@ AC_ARG_ENABLE(gss,[ --enable-gss
- *) AC_MSG_ERROR(bad value ${enableval} for --enable-gss) ;;
- esac],[gss=false])
- AM_CONDITIONAL(GSS, test x$gss = xtrue)
-+if test x$gss = xtrue; then
-+ PKG_CHECK_MODULES(GSSAPI, libgssglue >= 0.1, [],
-+ AC_MSG_ERROR([Unable to locate information required to use libgssapi.]))
-+fi
-
-
- AC_PROG_CC
+++ /dev/null
-diff --git a/src/bindresvport.c b/src/bindresvport.c
-index b197efa..bc75d29 100644
---- a/src/bindresvport.c
-+++ b/src/bindresvport.c
-@@ -62,6 +62,7 @@ bindresvport(sd, sin)
- #ifdef __linux__
-
- #define STARTPORT 600
-+#define LOWPORT 512
- #define ENDPORT (IPPORT_RESERVED - 1)
- #define NPORTS (ENDPORT - STARTPORT + 1)
-
-@@ -76,10 +77,13 @@ bindresvport_sa(sd, sa)
- #ifdef INET6
- struct sockaddr_in6 *sin6;
- #endif
-- u_int16_t port;
- u_int16_t *portp;
-+ static u_int16_t port;
-+ static short startport = STARTPORT;
- socklen_t salen;
-- int i;
-+ int nports = ENDPORT - startport + 1;
-+ int endport = ENDPORT;
-+ int i;
-
- if (sa == NULL) {
- salen = sizeof(myaddr);
-@@ -119,13 +123,22 @@ bindresvport_sa(sd, sa)
- }
- res = -1;
- errno = EADDRINUSE;
-- for (i = 0; i < NPORTS && res < 0 && errno == EADDRINUSE; i++) {
-+ again:
-+ for (i = 0; i < nports; ++i) {
- *portp = htons(port++);
-- if (port > ENDPORT) {
-- port = STARTPORT;
-- }
-+ if (port > endport)
-+ port = startport;
- res = bind(sd, sa, salen);
-+ if (res >= 0 || errno != EADDRINUSE)
-+ break;
- }
-+ if (i == nports && startport != LOWPORT) {
-+ startport = LOWPORT;
-+ endport = STARTPORT - 1;
-+ nports = STARTPORT - LOWPORT;
-+ port = LOWPORT + port % (STARTPORT - LOWPORT);
-+ goto again;
-+ }
- return (res);
- }
- #else
+++ /dev/null
-diff --git a/src/clnt_raw.c b/src/clnt_raw.c
-index 153dd87..36035c8 100644
---- a/src/clnt_raw.c
-+++ b/src/clnt_raw.c
-@@ -82,12 +82,13 @@ clnt_raw_create(prog, vers)
- rpcprog_t prog;
- rpcvers_t vers;
- {
-- struct clntraw_private *clp = clntraw_private;
-+ struct clntraw_private *clp;
- struct rpc_msg call_msg;
- XDR *xdrs = &clp->xdr_stream;
- CLIENT *client = &clp->client_object;
-
- mutex_lock(&clntraw_lock);
-+ clp = clntraw_private;
- if (clp == NULL) {
- clp = (struct clntraw_private *)calloc(1, sizeof (*clp));
- if (clp == NULL) {
+++ /dev/null
---- libtirpc-0.1.7/doc/etc_netconfig.orig 2005-05-18 01:10:50.000000000 -0400
-+++ libtirpc-0.1.7/doc/etc_netconfig 2006-08-11 11:06:06.000000000 -0400
-@@ -10,8 +10,8 @@
- # The <device> and <nametoaddr_libs> fields are always empty in this
- # implementation.
- #
--#udp6 tpi_clts v inet6 udp - -
--#tcp6 tpi_cots_ord v inet6 tcp - -
- udp tpi_clts v inet udp - -
- tcp tpi_cots_ord v inet tcp - -
-+udp6 tpi_clts v inet6 udp - -
-+tcp6 tpi_cots_ord v inet6 tcp - -
- rawip tpi_raw - inet - - -
- local tpi_cots_ord - loopback - - -
- unix tpi_cots_ord - loopback - - -
+++ /dev/null
-diff --git a/src/bindresvport.c b/src/bindresvport.c
-index bc75d29..6aac03c 100644
---- a/src/bindresvport.c
-+++ b/src/bindresvport.c
-@@ -101,14 +101,14 @@ bindresvport_sa(sd, sa)
- case AF_INET:
- sin = (struct sockaddr_in *)sa;
- salen = sizeof(struct sockaddr_in);
-- port = sin->sin_port;
-+ port = ntohs(sin->sin_port);
- portp = &sin->sin_port;
- break;
- #ifdef INET6
- case AF_INET6:
- sin6 = (struct sockaddr_in6 *)sa;
- salen = sizeof(struct sockaddr_in6);
-- port = sin6->sin6_port;
-+ port = ntohs(sin6->sin6_port);
- portp = &sin6->sin6_port;
- break;
- #endif
+++ /dev/null
---- libtirpc-0.1.7/src/xdr_float.c.orig 2005-05-18 01:10:50.000000000 -0400
-+++ libtirpc-0.1.7/src/xdr_float.c 2006-08-16 08:41:43.000000000 -0400
-@@ -58,7 +58,8 @@
- #if defined(__m68k__) || defined(__sparc__) || defined(__i386__) || \
- defined(__mips__) || defined(__ns32k__) || defined(__alpha__) || \
- defined(__arm32__) || defined(__ppc__) || defined(__ia64__) || \
-- defined(__arm26__) || defined(__sparc64__) || defined(__amd64__)
-+ defined(__arm26__) || defined(__sparc64__) || defined(__amd64__) || \
-+ defined(__powerpc__) || defined(__s390__)
- #include <bits/endian.h>
- #define IEEEFP
- #endif
+++ /dev/null
-diff --git a/src/clnt_dg.c b/src/clnt_dg.c
-index 151b449..0e35742 100644
---- a/src/clnt_dg.c
-+++ b/src/clnt_dg.c
-@@ -55,6 +55,13 @@
- #include <err.h>
- #include "rpc_com.h"
-
-+#ifdef IP_RECVERR
-+#include <asm/types.h>
-+#include <linux/errqueue.h>
-+#include <sys/uio.h>
-+#endif
-+
-+
- #define MAX_DEFAULT_FDS 20000
-
- static struct clnt_ops *clnt_dg_ops(void);
-@@ -246,6 +253,12 @@ clnt_dg_create(fd, svcaddr, program, version, sendsz, recvsz)
- #if 0
- (void)bindresvport_sa(fd, (struct sockaddr *)svcaddr->buf);
- #endif
-+#ifdef IP_RECVERR
-+ {
-+ int on = 1;
-+ setsockopt(fd, SOL_IP, IP_RECVERR, &on, sizeof(on));
-+ }
-+#endif
- ioctl(fd, FIONBIO, (char *)(void *)&one);
- /*
- * By default, closeit is always FALSE. It is users responsibility
-@@ -352,7 +365,7 @@ call_again:
- xid++;
- *(u_int32_t *)(void *)(cu->cu_outbuf) = htonl(xid);
-
-- if ((! XDR_PUTINT32(xdrs, &proc)) ||
-+ if ((! XDR_PUTINT32(xdrs, (int32_t *)&proc)) ||
- (! AUTH_MARSHALL(cl->cl_auth, xdrs)) ||
- (! (*xargs)(xdrs, argsp))) {
- cu->cu_error.re_status = RPC_CANTENCODEARGS;
-@@ -404,6 +417,48 @@ get_reply:
- }
- break;
- }
-+#ifdef IP_RECVERR
-+ if (fd.revents & POLLERR)
-+ {
-+ struct msghdr msg;
-+ struct cmsghdr *cmsg;
-+ struct sock_extended_err *e;
-+ struct sockaddr_in err_addr;
-+ struct sockaddr_in *sin = (struct sockaddr_in *)&cu->cu_raddr;
-+ struct iovec iov;
-+ char *cbuf = (char *) alloca (outlen + 256);
-+ int ret;
-+
-+ iov.iov_base = cbuf + 256;
-+ iov.iov_len = outlen;
-+ msg.msg_name = (void *) &err_addr;
-+ msg.msg_namelen = sizeof (err_addr);
-+ msg.msg_iov = &iov;
-+ msg.msg_iovlen = 1;
-+ msg.msg_flags = 0;
-+ msg.msg_control = cbuf;
-+ msg.msg_controllen = 256;
-+ ret = recvmsg (cu->cu_fd, &msg, MSG_ERRQUEUE);
-+ if (ret >= 0
-+ && memcmp (cbuf + 256, cu->cu_outbuf, ret) == 0
-+ && (msg.msg_flags & MSG_ERRQUEUE)
-+ && ((msg.msg_namelen == 0
-+ && ret >= 12)
-+ || (msg.msg_namelen == sizeof (err_addr)
-+ && err_addr.sin_family == AF_INET
-+ && memcmp (&err_addr.sin_addr, &sin->sin_addr,
-+ sizeof (err_addr.sin_addr)) == 0
-+ && err_addr.sin_port == sin->sin_port)))
-+ for (cmsg = CMSG_FIRSTHDR (&msg); cmsg;
-+ cmsg = CMSG_NXTHDR (&msg, cmsg))
-+ if (cmsg->cmsg_level == SOL_IP && cmsg->cmsg_type == IP_RECVERR)
-+ {
-+ e = (struct sock_extended_err *) CMSG_DATA(cmsg);
-+ cu->cu_error.re_errno = e->ee_errno;
-+ return (cu->cu_error.re_status = RPC_CANTRECV);
-+ }
-+ }
-+#endif
-
- /* We have some data now */
- do {
+++ /dev/null
-commit f8ff8f0de33606ff544dc87c0a9993fd3a0f5475
-Author: Steve Dickson <steved@redhat.com>
-Date: Mon Jul 30 07:26:45 2007 -0400
-
- - Make sure remote address (xp_rtaddr) is populated
- with the correct type of address.
-
- Signed-off-by: Steve Dickson <steved@redhat.com>
-
-diff --git a/src/svc_vc.c b/src/svc_vc.c
-index 48494e1..3d77aef 100644
---- a/src/svc_vc.c
-+++ b/src/svc_vc.c
-@@ -239,7 +239,10 @@ svc_fd_create(fd, sendsize, recvsize)
- warnx("svc_fd_create: no mem for local addr");
- goto freedata;
- }
-- memcpy(ret->xp_rtaddr.buf, &sin6, (size_t)sizeof(ss));
-+ if (ss.ss_family == AF_INET)
-+ memcpy(ret->xp_rtaddr.buf, &ss, (size_t)sizeof(ss));
-+ else
-+ memcpy(ret->xp_rtaddr.buf, &sin6, (size_t)sizeof(ss));
- #ifdef PORTMAP
- if (sin6.sin6_family == AF_INET6 || sin6.sin6_family == AF_LOCAL) {
- memcpy(&ret->xp_raddr, ret->xp_rtaddr.buf,
-@@ -343,20 +346,23 @@ again:
- newxprt = makefd_xprt(sock, r->sendsize, r->recvsize);
- if (addr.ss_family == AF_INET) {
- map_ipv4_to_ipv6((struct sockaddr_in *)&addr, &sin6);
-- len = sizeof(struct sockaddr_in6);
- } else {
- memcpy(&sin6, &addr, len);
- }
- newxprt->xp_rtaddr.buf = mem_alloc(len);
- if (newxprt->xp_rtaddr.buf == NULL)
- return (FALSE);
-- memcpy(newxprt->xp_rtaddr.buf, &sin6, len);
-+
-+ if (addr.ss_family == AF_INET)
-+ memcpy(newxprt->xp_rtaddr.buf, &addr, len);
-+ else
-+ memcpy(newxprt->xp_rtaddr.buf, &sin6, len);
- newxprt->xp_rtaddr.maxlen = newxprt->xp_rtaddr.len = len;
- #ifdef PORTMAP
- if (sin6.sin6_family == AF_INET6 || sin6.sin6_family == AF_LOCAL) {
- memcpy(&newxprt->xp_raddr, newxprt->xp_rtaddr.buf,
- sizeof(struct sockaddr_in6));
-- newxprt->xp_addrlen = len;
-+ newxprt->xp_addrlen = sizeof(struct sockaddr_in6);
- }
- #endif /* PORTMAP */
- if (__rpc_fd2sockinfo(sock, &si) && si.si_proto == IPPROTO_TCP) {
+++ /dev/null
---- libtirpc-0.1.7/tirpc/rpc/svc_auth.h.orig 2005-05-18 01:10:51.000000000 -0400
-+++ libtirpc-0.1.7/tirpc/rpc/svc_auth.h 2006-08-28 08:13:37.801283000 -0400
-@@ -54,6 +54,9 @@
- caddr_t svc_ah_private;
- } SVCAUTH;
-
-+#define SVCAUTH_DESTROY(cred) ((*(cred)->svc_ah_ops->svc_ah_destroy)())
-+#define svcauth_destroy(cred) ((*(cred)->svc_ah_ops->svc_ah_destroy)())
-+
- /*
- * Server side authenticator
- */
+++ /dev/null
-diff --git a/src/xdr.c b/src/xdr.c
-index 764c30f..292723b 100644
---- a/src/xdr.c
-+++ b/src/xdr.c
-@@ -669,6 +669,8 @@ xdr_string(xdrs, cpp, maxsize)
- }
- /* FALLTHROUGH */
- case XDR_ENCODE:
-+ if (sp == NULL)
-+ return FALSE;
- size = strlen(sp);
- break;
- case XDR_DECODE:
-@@ -681,6 +683,13 @@ xdr_string(xdrs, cpp, maxsize)
- return (FALSE);
- }
- nodesize = size + 1;
-+ if (nodesize == 0) {
-+ /* This means an overflow. It a bug in the caller which
-+ * provided a too large maxsize but nevertheless catch it
-+ * here.
-+ */
-+ return FALSE;
-+ }
-
- /*
- * now deal with the actual bytes
-@@ -688,9 +697,6 @@ xdr_string(xdrs, cpp, maxsize)
- switch (xdrs->x_op) {
-
- case XDR_DECODE:
-- if (nodesize == 0) {
-- return (TRUE);
-- }
- if (sp == NULL)
- *cpp = sp = mem_alloc(nodesize);
- if (sp == NULL) {