]> git.puffer.fish Git - matthieu/frr.git/commitdiff
[bug #89] Fix leak of community when set community is used
authorPaul Jakma <paul.jakma@sun.com>
Sat, 18 Feb 2006 10:49:04 +0000 (10:49 +0000)
committerPaul Jakma <paul.jakma@sun.com>
Sat, 18 Feb 2006 10:49:04 +0000 (10:49 +0000)
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.

bgpd/ChangeLog
bgpd/bgp_routemap.c

index 6101b50e8d609d297358684c78e220018faae2d2..78a22e67046485b5e2f484cb191d36b0ffd2901f 100644 (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
index 15ba9452d27b49dc4f3ad52fd5fa30c4f0d6e879..806a50727ebd0a8643f2a76fc9191df5f4764a49 100644 (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);