[bug #89] Fix leak of community when set community is used

2006-02-18 Paul Jakma <paul.jakma@sun.com>

	* bgp_routemap.c: (route_set_community) Quick, very hacky, fix
	  for the set-community leak, bug #89. True fix will be to
	  detangle the web of *_intern caching and provide saner object
	  caching for Quagga, future work.
This commit is contained in:
Paul Jakma 2006-02-18 10:49:04 +00:00
parent 3fff6ffc69
commit aa94ca86ba
2 changed files with 17 additions and 2 deletions

View File

@ -1,3 +1,10 @@
2006-02-18 Paul Jakma <paul.jakma@sun.com>
* bgp_routemap.c: (route_set_community) Quick, very hacky, fix
for the set-community leak, bug #89. True fix will be to
detangle the web of *_intern caching and provide saner object
caching for Quagga, future work.
2006-02-05 Paul Jakma <paul.jakma@sun.com>
* bgp_route.h: Add BGP_INFO_COUNTED to track whether

View File

@ -1195,7 +1195,7 @@ route_set_community (void *rule, struct prefix *prefix,
struct community *new = NULL;
struct community *old;
struct community *merge;
if (type == RMAP_BGP)
{
rcs = rule;
@ -1215,12 +1215,20 @@ route_set_community (void *rule, struct prefix *prefix,
if (rcs->additive && old)
{
merge = community_merge (community_dup (old), rcs->com);
/* HACK: if the old community is not intern'd,
* we should free it here, or all reference to it may be lost.
* Really need to cleanup attribute caching sometime.
*/
if (old->refcnt == 0)
community_free (old);
new = community_uniq_sort (merge);
community_free (merge);
}
else
new = community_dup (rcs->com);
/* will be interned by caller if required */
attr->community = new;
attr->flag |= ATTR_FLAG_BIT (BGP_ATTR_COMMUNITIES);