diff options
author | Chuck Lever <chuck.lever@oracle.com> | 2010-03-25 13:25:48 -0400 |
---|---|---|
committer | Steve Dickson <steved@redhat.com> | 2010-03-25 13:30:20 -0400 |
commit | cd1401995457316ccab5f7d2a9e31237c5c3273f (patch) | |
tree | 7a716fde8dbac81f48c347bf448eeab16f90237b | |
parent | 40e44667d87cd676588d4a85395f1814029cae78 (diff) | |
download | ti-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.c | 18 |
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); } /* |