diff options
-rw-r--r-- | bgpd/ChangeLog | 7 | ||||
-rw-r--r-- | bgpd/bgp_routemap.c | 12 |
2 files changed, 17 insertions, 2 deletions
diff --git a/bgpd/ChangeLog b/bgpd/ChangeLog index 6101b50e..78a22e67 100644 --- a/bgpd/ChangeLog +++ b/bgpd/ChangeLog @@ -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 diff --git a/bgpd/bgp_routemap.c b/bgpd/bgp_routemap.c index 15ba9452..806a5072 100644 --- a/bgpd/bgp_routemap.c +++ b/bgpd/bgp_routemap.c @@ -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); |