From cd1401995457316ccab5f7d2a9e31237c5c3273f Mon Sep 17 00:00:00 2001 From: Chuck Lever Date: Thu, 25 Mar 2010 13:25:48 -0400 Subject: Fix memory leak in rpcb_clnt.c:add_cache() Ensure memory is freed if an error occurs. Memory allocation errors are rare, so probably not a big deal. But worth tidying. Reported-by: Jens-Uwe Mozdzen Signed-off-by: Chuck Lever Signed-off-by: Steve Dickson --- src/rpcb_clnt.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/src/rpcb_clnt.c b/src/rpcb_clnt.c index 87feb6d..218ff7c 100644 --- a/src/rpcb_clnt.c +++ b/src/rpcb_clnt.c @@ -212,14 +212,12 @@ add_cache(host, netid, taddr, uaddr) ad_cache->ac_uaddr = uaddr ? strdup(uaddr) : NULL; ad_cache->ac_taddr = (struct netbuf *)malloc(sizeof (struct netbuf)); if (!ad_cache->ac_host || !ad_cache->ac_netid || !ad_cache->ac_taddr || - (uaddr && !ad_cache->ac_uaddr)) { - return; - } + (uaddr && !ad_cache->ac_uaddr)) + goto out_free; ad_cache->ac_taddr->len = ad_cache->ac_taddr->maxlen = taddr->len; ad_cache->ac_taddr->buf = (char *) malloc(taddr->len); - if (ad_cache->ac_taddr->buf == NULL) { - return; - } + if (ad_cache->ac_taddr->buf == NULL) + goto out_free; memcpy(ad_cache->ac_taddr->buf, taddr->buf, taddr->len); #ifdef ND_DEBUG fprintf(stderr, "Added to cache: %s : %s\n", host, netid); @@ -263,6 +261,14 @@ add_cache(host, netid, taddr, uaddr) free(cptr); } rwlock_unlock(&rpcbaddr_cache_lock); + return; + +out_free: + free(ad_cache->ac_host); + free(ad_cache->ac_netid); + free(ad_cache->ac_uaddr); + free(ad_cache->ac_taddr); + free(ad_cache); } /* -- cgit v1.2.1