File libtirpc-0.1.9-0007-Introduce-__rpc_set_netbuf-helper.patch of Package libtirpc

From d94b92d5125242ce595c1baf42a1e6d1004b7756 Mon Sep 17 00:00:00 2001
From: Olaf Kirch <okir@suse.de>
Date: Tue, 30 Sep 2008 15:06:54 -0400
Subject: [PATCH] Introduce __rpc_set_netbuf helper

The RPC code contains a number of places where a netbuf
is initialized with some data. All the mem_alloc/memcpy
stuff is open-coded. Introduce a helper function and
convert the code.

Signed-off-by: Olaf Kirch <okir@suse.de>
Signed-off-by: Steve Dickson <steved@redhat.com>
---
 src/rpc_com.h     |    1 +
 src/rpc_generic.c |   19 +++++++++++++++++++
 src/svc_dg.c      |   14 +++-----------
 src/svc_vc.c      |   24 ++++++------------------
 4 files changed, 29 insertions(+), 29 deletions(-)

diff --git a/src/rpc_com.h b/src/rpc_com.h
index a935080..0981471 100644
--- a/src/rpc_com.h
+++ b/src/rpc_com.h
@@ -61,6 +61,7 @@ extern u_int __rpc_get_a_size(int);
 extern int __rpc_dtbsize(void);
 extern struct netconfig * __rpcgettp(int);
 extern  int  __rpc_get_default_domain(char **);
+struct netbuf *__rpc_set_netbuf(struct netbuf *, const void *, size_t);
 
 char *__rpc_taddr2uaddr_af(int, const struct netbuf *);
 struct netbuf *__rpc_uaddr2taddr_af(int, const char *);
diff --git a/src/rpc_generic.c b/src/rpc_generic.c
index b436e3a..9ada668 100644
--- a/src/rpc_generic.c
+++ b/src/rpc_generic.c
@@ -833,3 +833,22 @@ __rpc_sockisbound(int fd)
 
 	return 0;
 }
+
+/*
+ * Helper function to set up a netbuf
+ */
+struct netbuf *
+__rpc_set_netbuf(struct netbuf *nb, const void *ptr, size_t len)
+{
+	if (nb->len != len) {
+		if (nb->len)
+			mem_free(nb->buf, nb->len);
+		nb->buf = mem_alloc(len);
+		if (nb->buf == NULL)
+			return NULL;
+
+		nb->maxlen = nb->len = len;
+	}
+	memcpy(nb->buf, ptr, len);
+	return nb;
+}
diff --git a/src/svc_dg.c b/src/svc_dg.c
index 76a480e..7df470e 100644
--- a/src/svc_dg.c
+++ b/src/svc_dg.c
@@ -140,10 +140,7 @@ svc_dg_create(fd, sendsize, recvsize)
 	slen = sizeof ss;
 	if (getsockname(fd, (struct sockaddr *)(void *)&ss, &slen) < 0)
 		goto freedata;
-	xprt->xp_ltaddr.buf = mem_alloc(sizeof (struct sockaddr_storage));
-	xprt->xp_ltaddr.maxlen = sizeof (struct sockaddr_storage);
-	xprt->xp_ltaddr.len = slen;
-	memcpy(xprt->xp_ltaddr.buf, &ss, slen);
+	__rpc_set_netbuf(&xprt->xp_ltaddr, &ss, slen);
 
 	xprt_register(xprt);
 	return (xprt);
@@ -186,13 +183,8 @@ again:
 		goto again;
 	if (rlen == -1 || (rlen < (ssize_t)(4 * sizeof (u_int32_t))))
 		return (FALSE);
-	if (xprt->xp_rtaddr.len < alen) {
-		if (xprt->xp_rtaddr.len != 0)
-			mem_free(xprt->xp_rtaddr.buf, xprt->xp_rtaddr.len);
-		xprt->xp_rtaddr.buf = mem_alloc(alen);
-		xprt->xp_rtaddr.len = alen;
-	}
-	memcpy(xprt->xp_rtaddr.buf, &ss, alen);
+	__rpc_set_netbuf(&xprt->xp_rtaddr, &ss, alen);
+
 	__xprt_set_raddr(xprt, &ss);
 	xdrs->x_op = XDR_DECODE;
 	XDR_SETPOS(xdrs, 0);
diff --git a/src/svc_vc.c b/src/svc_vc.c
index 0d532a0..44d3497 100644
--- a/src/svc_vc.c
+++ b/src/svc_vc.c
@@ -184,14 +184,10 @@ svc_vc_create(fd, sendsize, recvsize)
 		goto cleanup_svc_vc_create;
 	}
 
-	xprt->xp_ltaddr.maxlen = xprt->xp_ltaddr.len = sizeof(sslocal);
-	xprt->xp_ltaddr.buf = mem_alloc((size_t)sizeof(sslocal));
-	if (xprt->xp_ltaddr.buf == NULL) {
+	if (!__rpc_set_netbuf(&xprt->xp_ltaddr, &sslocal, sizeof(sslocal))) {
 		warnx("svc_vc_create: no mem for local addr");
 		goto cleanup_svc_vc_create;
 	}
-	memcpy(xprt->xp_ltaddr.buf, &sslocal, (size_t)sizeof(sslocal));
-	xprt->xp_rtaddr.maxlen = sizeof (struct sockaddr_storage);
 	xprt_register(xprt);
 	return (xprt);
 cleanup_svc_vc_create:
@@ -225,25 +221,20 @@ svc_fd_create(fd, sendsize, recvsize)
 		warnx("svc_fd_create: could not retrieve local addr");
 		goto freedata;
 	}
-	ret->xp_ltaddr.maxlen = ret->xp_ltaddr.len = sizeof(ss);
-	ret->xp_ltaddr.buf = mem_alloc((size_t)sizeof(ss));
-	if (ret->xp_ltaddr.buf == NULL) {
+	if (!__rpc_set_netbuf(&ret->xp_ltaddr, &ss, sizeof(ss))) {
 		warnx("svc_fd_create: no mem for local addr");
 		goto freedata;
 	}
-	memcpy(ret->xp_ltaddr.buf, &ss, (size_t)sizeof(ss));
+
 	slen = sizeof (struct sockaddr_storage);
 	if (getpeername(fd, (struct sockaddr *)(void *)&ss, &slen) < 0) {
 		warnx("svc_fd_create: could not retrieve remote addr");
 		goto freedata;
 	}
-	ret->xp_rtaddr.maxlen = ret->xp_rtaddr.len = sizeof(ss);
-	ret->xp_rtaddr.buf = mem_alloc((size_t)sizeof(ss));
-	if (ret->xp_rtaddr.buf == NULL) {
+	if (!__rpc_set_netbuf(&ret->xp_rtaddr, &ss, sizeof(ss))) {
 		warnx("svc_fd_create: no mem for local addr");
 		goto freedata;
 	}
-	memcpy(ret->xp_rtaddr.buf, &ss, (size_t)sizeof(ss));
 
 	/* Set xp_raddr for compatibility */
 	__xprt_set_raddr(ret, &ss);
@@ -340,12 +331,9 @@ again:
 	 */
 
 	newxprt = makefd_xprt(sock, r->sendsize, r->recvsize);
-	newxprt->xp_rtaddr.buf = mem_alloc(len);
-	if (newxprt->xp_rtaddr.buf == NULL)
-		return (FALSE);
 
-	memcpy(newxprt->xp_rtaddr.buf, &addr, len);
-	newxprt->xp_rtaddr.maxlen = newxprt->xp_rtaddr.len = len;
+	if (!__rpc_set_netbuf(&newxprt->xp_rtaddr, &addr, len))
+		return (FALSE);
 
 	__xprt_set_raddr(newxprt, &addr);
 
-- 
1.5.6

openSUSE Build Service is sponsored by