summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChuck Lever <chuck.lever@oracle.com>2010-03-25 13:25:48 -0400
committerSteve Dickson <steved@redhat.com>2010-03-25 13:30:20 -0400
commitcd1401995457316ccab5f7d2a9e31237c5c3273f (patch)
tree7a716fde8dbac81f48c347bf448eeab16f90237b
parent40e44667d87cd676588d4a85395f1814029cae78 (diff)
downloadti-rpc-cd1401995457316ccab5f7d2a9e31237c5c3273f.tar.gz
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 <jmozdzen@nde.ag> Signed-off-by: Chuck Lever <chuck.lever@oracle.com> Signed-off-by: Steve Dickson <steved@redhat.com>
-rw-r--r--src/rpcb_clnt.c18
1 files 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);
}
/*