65 lines
1.6 KiB
Diff
65 lines
1.6 KiB
Diff
Index: usr.sbin/rpcbind/rpcb_svc_com.c
|
|
===================================================================
|
|
--- usr.sbin/rpcbind/rpcb_svc_com.c (revision 288019)
|
|
+++ usr.sbin/rpcbind/rpcb_svc_com.c (working copy)
|
|
@@ -47,6 +47,7 @@
|
|
#include <rpc/rpc.h>
|
|
#include <rpc/rpcb_prot.h>
|
|
#include <rpc/svc_dg.h>
|
|
+#include <assert.h>
|
|
#include <netconfig.h>
|
|
#include <errno.h>
|
|
#include <syslog.h>
|
|
@@ -1047,19 +1048,31 @@ netbufcmp(struct netbuf *n1, struct netbuf *n2)
|
|
return ((n1->len != n2->len) || memcmp(n1->buf, n2->buf, n1->len));
|
|
}
|
|
|
|
+static bool_t
|
|
+netbuf_copybuf(struct netbuf *dst, const struct netbuf *src)
|
|
+{
|
|
+
|
|
+ assert(dst->buf == NULL);
|
|
+
|
|
+ if ((dst->buf = malloc(src->len)) == NULL)
|
|
+ return (FALSE);
|
|
+
|
|
+ dst->maxlen = dst->len = src->len;
|
|
+ memcpy(dst->buf, src->buf, src->len);
|
|
+ return (TRUE);
|
|
+}
|
|
+
|
|
static struct netbuf *
|
|
netbufdup(struct netbuf *ap)
|
|
{
|
|
struct netbuf *np;
|
|
|
|
- if ((np = malloc(sizeof(struct netbuf))) == NULL)
|
|
+ if ((np = calloc(1, sizeof(struct netbuf))) == NULL)
|
|
return (NULL);
|
|
- if ((np->buf = malloc(ap->len)) == NULL) {
|
|
+ if (netbuf_copybuf(np, ap) == FALSE) {
|
|
free(np);
|
|
return (NULL);
|
|
}
|
|
- np->maxlen = np->len = ap->len;
|
|
- memcpy(np->buf, ap->buf, ap->len);
|
|
return (np);
|
|
}
|
|
|
|
@@ -1067,6 +1080,7 @@ static void
|
|
netbuffree(struct netbuf *ap)
|
|
{
|
|
free(ap->buf);
|
|
+ ap->buf = NULL;
|
|
free(ap);
|
|
}
|
|
|
|
@@ -1184,7 +1198,7 @@ xprt_set_caller(SVCXPRT *xprt, struct finfo *fi)
|
|
{
|
|
u_int32_t *xidp;
|
|
|
|
- *(svc_getrpccaller(xprt)) = *(fi->caller_addr);
|
|
+ netbuf_copybuf(svc_getrpccaller(xprt), fi->caller_addr);
|
|
xidp = __rpcb_get_dg_xidp(xprt);
|
|
*xidp = fi->caller_xid;
|
|
}
|