[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.
diff --git a/bgpd/bgp_routemap.c b/bgpd/bgp_routemap.c
index 15ba945..806a507 100644
--- a/bgpd/bgp_routemap.c
+++ b/bgpd/bgp_routemap.c
@@ -1195,7 +1195,7 @@
   struct community *new = NULL;
   struct community *old;
   struct community *merge;
-
+  
   if (type == RMAP_BGP)
     {
       rcs = rule;
@@ -1215,12 +1215,20 @@
       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);