]> git.proxmox.com Git - mirror_frr.git/commit
bgpd: Try fix extcommunity resource allocation probs, particularly with 'set extcom..'
authorPaul Jakma <paul@quagga.net>
Tue, 23 Nov 2010 21:28:03 +0000 (21:28 +0000)
committerPaul Jakma <paul@quagga.net>
Mon, 21 Mar 2011 13:51:14 +0000 (13:51 +0000)
commitf6f434b2822c453f898552537180a812538bd19e
tree81f5de3c1eeb6679635e7363396c08b807b04ad9
parent50ef565e4e689ba653b9709be4d28a01f6cca885
bgpd: Try fix extcommunity resource allocation probs, particularly with 'set extcom..'

* Extended communities has some kind of resource allocation problem which
  causes a double-free if the 'set extcommunity ...' command is used.
  Try fix by properly interning extcommunities.

  Also, more generally, make unintern functions take a double pointer
  so they can NULL out callers references - a usefully defensive programming
  pattern for functions which make refs invalid.

  Sadly, this patch doesn't fix the problem entirely - crashes still
  occur on session clear.

* bgp_ecommunity.h: (ecommunity_{free,unintern}) take double pointer
  args.
* bgp_community.h: (community_unintern) ditto
* bgp_attr.h: (bgp_attr_intern) ditto
* bgp_aspath.h: (bgp_aspath.h) ditto
* (general) update all callers of above
* bgp_routemap.c: (route_set_ecommunity_{rt,soo}) intern the new extcom added
  to the attr, and unintern any old one.
  (route_set_ecommunity_{rt,soo}_compile) intern the extcom to be used
  for the route-map set.
  (route_set_ecommunity_*_free) unintern to match, instead of free
  (route_set_ecommunity_soo) Do as _rt does and don't just leak
  any pre-existing community, add to it (is additive right though?)
13 files changed:
bgpd/bgp_advertise.c
bgpd/bgp_aspath.c
bgpd/bgp_aspath.h
bgpd/bgp_attr.c
bgpd/bgp_attr.h
bgpd/bgp_clist.c
bgpd/bgp_community.c
bgpd/bgp_community.h
bgpd/bgp_ecommunity.c
bgpd/bgp_ecommunity.h
bgpd/bgp_packet.c
bgpd/bgp_route.c
bgpd/bgp_routemap.c