From c1d0909a534383d2caebd5b248b48a9c690bdb4a Mon Sep 17 00:00:00 2001 From: Hiroki Sato Date: Tue, 6 Oct 2015 08:43:48 +0000 Subject: [PATCH] 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. --- usr.sbin/rpcbind/rpcb_svc_com.c | 10 ++++++---- 1 file 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); }