]> granicus.if.org Git - libtirpc/commitdiff
Fix memory leak in rpcb_clnt.c:add_cache()
authorChuck Lever <chuck.lever@oracle.com>
Thu, 25 Mar 2010 17:25:48 +0000 (13:25 -0400)
committerSteve Dickson <steved@redhat.com>
Thu, 25 Mar 2010 17:30:20 +0000 (13:30 -0400)
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>
src/rpcb_clnt.c

index 87feb6d97ff63c4d52721d47b19d660fc503c338..218ff7c61501ac361f91c01564053d5d6c7b423e 100644 (file)
@@ -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);
 }
 
 /*