aboutsummaryrefslogtreecommitdiff
path: root/usr.sbin/rpcbind
diff options
context:
space:
mode:
authorHiroki Sato <hrs@FreeBSD.org>2015-10-06 08:43:48 +0000
committerHiroki Sato <hrs@FreeBSD.org>2015-10-06 08:43:48 +0000
commitc1d0909a534383d2caebd5b248b48a9c690bdb4a (patch)
tree4ad6c2afa957672984edeb0a09d74d60564bbab3 /usr.sbin/rpcbind
parent62d4443f00fb9f14a1234dc9ef4d85bc13b59586 (diff)
downloadsrc-c1d0909a534383d2caebd5b248b48a9c690bdb4a.tar.gz
src-c1d0909a534383d2caebd5b248b48a9c690bdb4a.zip
Reallocate a maxlen-long buffer only when the current maxlen is
shorter than the required length. Note that it rarely happens because maxlen is almost always 128 which covers struct sockaddr_storage.
Notes
Notes: svn path=/head/; revision=288915
Diffstat (limited to 'usr.sbin/rpcbind')
-rw-r--r--usr.sbin/rpcbind/rpcb_svc_com.c10
1 files changed, 6 insertions, 4 deletions
diff --git a/usr.sbin/rpcbind/rpcb_svc_com.c b/usr.sbin/rpcbind/rpcb_svc_com.c
index 326224a6062e..2ee2a4c7d87e 100644
--- a/usr.sbin/rpcbind/rpcb_svc_com.c
+++ b/usr.sbin/rpcbind/rpcb_svc_com.c
@@ -1051,17 +1051,19 @@ netbufcmp(struct netbuf *n1, struct netbuf *n2)
static bool_t
netbuf_copybuf(struct netbuf *dst, const struct netbuf *src)
{
+ assert(src->len <= src->maxlen);
- if (dst->len != src->len || dst->buf == NULL) {
+ if (dst->maxlen < src->len || dst->buf == NULL) {
if (dst->buf != NULL)
free(dst->buf);
- if ((dst->buf = malloc(src->len)) == NULL)
+ if ((dst->buf = calloc(1, src->maxlen)) == NULL)
return (FALSE);
-
- dst->maxlen = dst->len = src->len;
+ dst->maxlen = src->maxlen;
}
+ dst->len = src->len;
memcpy(dst->buf, src->buf, src->len);
+
return (TRUE);
}