mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-13 22:57:45 +00:00
[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:
parent
3fff6ffc69
commit
aa94ca86ba
@ -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>
|
2006-02-05 Paul Jakma <paul.jakma@sun.com>
|
||||||
|
|
||||||
* bgp_route.h: Add BGP_INFO_COUNTED to track whether
|
* bgp_route.h: Add BGP_INFO_COUNTED to track whether
|
||||||
|
@ -1195,7 +1195,7 @@ route_set_community (void *rule, struct prefix *prefix,
|
|||||||
struct community *new = NULL;
|
struct community *new = NULL;
|
||||||
struct community *old;
|
struct community *old;
|
||||||
struct community *merge;
|
struct community *merge;
|
||||||
|
|
||||||
if (type == RMAP_BGP)
|
if (type == RMAP_BGP)
|
||||||
{
|
{
|
||||||
rcs = rule;
|
rcs = rule;
|
||||||
@ -1215,12 +1215,20 @@ route_set_community (void *rule, struct prefix *prefix,
|
|||||||
if (rcs->additive && old)
|
if (rcs->additive && old)
|
||||||
{
|
{
|
||||||
merge = community_merge (community_dup (old), rcs->com);
|
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);
|
new = community_uniq_sort (merge);
|
||||||
community_free (merge);
|
community_free (merge);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
new = community_dup (rcs->com);
|
new = community_dup (rcs->com);
|
||||||
|
|
||||||
|
/* will be interned by caller if required */
|
||||||
attr->community = new;
|
attr->community = new;
|
||||||
|
|
||||||
attr->flag |= ATTR_FLAG_BIT (BGP_ATTR_COMMUNITIES);
|
attr->flag |= ATTR_FLAG_BIT (BGP_ATTR_COMMUNITIES);
|
||||||
|
Loading…
Reference in New Issue
Block a user