Blob Blame History Raw
diff --git a/INSTALL b/INSTALL
index 8b641e3..f812f5a 120000
--- a/INSTALL
+++ b/INSTALL
@@ -1 +1 @@
-/usr/share/automake-1.13/INSTALL
\ No newline at end of file
+/usr/share/automake-1.14/INSTALL
\ No newline at end of file
diff --git a/configure.ac b/configure.ac
index bcbe911..10d17ea 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1,4 +1,4 @@
-AC_INIT(libtirpc, 0.2.5)
+AC_INIT(libtirpc, 0.2.4)
 AM_INIT_AUTOMAKE([silent-rules])
 AM_SILENT_RULES([yes])
 AC_CONFIG_SRCDIR([src/auth_des.c])
diff --git a/libtirpc.pc.in b/libtirpc.pc.in
index ec4cf75..38034c5 100644
--- a/libtirpc.pc.in
+++ b/libtirpc.pc.in
@@ -8,4 +8,5 @@ Description: Transport Independent RPC Library
 Requires:
 Version: @PACKAGE_VERSION@
 Libs: -L@libdir@ -ltirpc
+Libs.private: -lpthread
 Cflags: -I@includedir@/tirpc
diff --git a/src/clnt_bcast.c b/src/clnt_bcast.c
index 373d8a5..ddcb694 100644
--- a/src/clnt_bcast.c
+++ b/src/clnt_bcast.c
@@ -142,7 +142,8 @@ __rpc_getbroadifs(int af, int proto, int socktype, broadlist_t *list)
 		return 0;
 
 	for (ifap = ifp; ifap != NULL; ifap = ifap->ifa_next) {
-		if (ifap->ifa_addr->sa_family != af ||
+		if (ifap->ifa_addr == NULL ||		/* happens for eg tuntap devices */
+		    ifap->ifa_addr->sa_family != af ||
 		    !(ifap->ifa_flags & IFF_UP))
 			continue;
 		bip = (struct broadif *)malloc(sizeof *bip);
@@ -588,9 +589,11 @@ rpc_broadcast_exp(prog, vers, proc, xargs, argsp, xresults, resultsp,
 						LIBTIRPC_DEBUG(3, ("rpc_broadcast_exp: uaddr %s\n", uaddrp));
 						np = uaddr2taddr(
 						    fdlist[i].nconf, uaddrp);
-						done = (*eachresult)(resultsp,
-						    np, fdlist[i].nconf);
-						free(np);
+						if (np != NULL) {
+							done = (*eachresult)(resultsp,
+							    np, fdlist[i].nconf);
+							free(np);
+						}
 #ifdef PORTMAP
 					}
 #endif				/* PORTMAP */
diff --git a/src/debug.h b/src/debug.h
index afc8d57..c971ac3 100644
--- a/src/debug.h
+++ b/src/debug.h
@@ -21,6 +21,8 @@
 
 #ifndef _DEBUG_H
 #define _DEBUG_H
+
+#include <stdarg.h>
 #include <syslog.h>
 
 extern int libtirpc_debug_level;
diff --git a/src/rpc_generic.c b/src/rpc_generic.c
index a43906c..764a25c 100644
--- a/src/rpc_generic.c
+++ b/src/rpc_generic.c
@@ -608,6 +608,7 @@ __rpc_taddr2uaddr_af(int af, const struct netbuf *nbuf)
 	struct sockaddr_in6 *sin6;
 	char namebuf6[INET6_ADDRSTRLEN];
 #endif
+	int path_len;
 	u_int16_t port;
 
 	if (nbuf->len <= 0)
@@ -638,13 +639,12 @@ __rpc_taddr2uaddr_af(int af, const struct netbuf *nbuf)
 #endif
 	case AF_LOCAL:
 		sun = nbuf->buf;
-		/*	if (asprintf(&ret, "%.*s", (int)(sun->sun_len -
-		    offsetof(struct sockaddr_un, sun_path)),
-		    sun->sun_path) < 0)*/
-		if (asprintf(&ret, "%.*s", (int)(sizeof(*sun) -
-						 offsetof(struct sockaddr_un, sun_path)),
-			     sun->sun_path) < 0)
 
+		path_len = nbuf->len - offsetof(struct sockaddr_un, sun_path);
+		if (path_len < 0)
+			return NULL;
+
+		if (asprintf(&ret, "%.*s", path_len, sun->sun_path) < 0)
 			return (NULL);
 		break;
 	default:
diff --git a/src/rpc_soc.c b/src/rpc_soc.c
index 338edbb..e146ed4 100644
--- a/src/rpc_soc.c
+++ b/src/rpc_soc.c
@@ -564,16 +564,12 @@ clntunix_create(raddr, prog, vers, sockp, sendsz, recvsz)
 	u_int sendsz;
 	u_int recvsz;
 {
-	struct netbuf *svcaddr;
-	CLIENT *cl;
+	struct netbuf svcaddr = {0, 0, NULL};
+	CLIENT *cl = NULL;
 	int len;
 
-	cl = NULL;
-	svcaddr = NULL;
-	if (((svcaddr = malloc(sizeof(struct netbuf))) == NULL ) ||
-	    ((svcaddr->buf = malloc(sizeof(struct sockaddr_un))) == NULL)) {
-		if (svcaddr != NULL)
-			free(svcaddr);
+	memset(&svcaddr, 0, sizeof(svcaddr));
+	if (__rpc_set_netbuf(&svcaddr, raddr, sizeof(*raddr)) == NULL) {
 		rpc_createerr.cf_stat = RPC_SYSTEMERROR;
 		rpc_createerr.cf_error.re_errno = errno;
 		return(cl);
@@ -590,14 +586,10 @@ clntunix_create(raddr, prog, vers, sockp, sendsz, recvsz)
 			goto done;
 		}
 	}
-	svcaddr->buf = raddr;
-	svcaddr->len = sizeof(raddr);
-	svcaddr->maxlen = sizeof (struct sockaddr_un);
-	cl = clnt_vc_create(*sockp, svcaddr, prog,
+	cl = clnt_vc_create(*sockp, &svcaddr, prog,
 	    vers, sendsz, recvsz);
 done:
-	free(svcaddr->buf);
-	free(svcaddr);
+	free(svcaddr.buf);
 	return(cl);
 }
 
diff --git a/src/rpcb_clnt.c b/src/rpcb_clnt.c
index a796593..f1c71a2 100644
--- a/src/rpcb_clnt.c
+++ b/src/rpcb_clnt.c
@@ -401,6 +401,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"
@@ -733,34 +771,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, host, &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/src/svc_vc.c b/src/svc_vc.c
index 4c70de8..4d3ea51 100644
--- a/src/svc_vc.c
+++ b/src/svc_vc.c
@@ -559,20 +559,19 @@ write_vc(xprtp, buf, len)
 				cd->strm_stat = XPRT_DIED;
 				return (-1);
 			}
-			if (cd->nonblock && i != cnt) {
-				/*
-				 * For non-blocking connections, do not
-				 * take more than 2 seconds writing the
-				 * data out.
-				 *
-				 * XXX 2 is an arbitrary amount.
-				 */
-				gettimeofday(&tv1, NULL);
-				if (tv1.tv_sec - tv0.tv_sec >= 2) {
-					cd->strm_stat = XPRT_DIED;
-					return (-1);
-				}
+			/*
+			 * For non-blocking connections, do not
+			 * take more than 2 seconds writing the
+			 * data out.
+			 *
+			 * XXX 2 is an arbitrary amount.
+			 */
+			gettimeofday(&tv1, NULL);
+			if (tv1.tv_sec - tv0.tv_sec >= 2) {
+				cd->strm_stat = XPRT_DIED;
+				return (-1);
 			}
+			i = 0; /* Don't change buf and cnt */
 		}
 	}