From: vivek Date: Wed, 16 Mar 2016 20:38:31 +0000 (+0000) Subject: BGP: Fix linkage between BGP instance and VRF structure X-Git-Tag: frr-2.0-rc1~1061 X-Git-Url: https://git.puffer.fish/?a=commitdiff_plain;h=59ecefe2db1a69b0a5a5169d0ad88a5701762e64;p=mirror%2Ffrr.git BGP: Fix linkage between BGP instance and VRF structure The issue here has to do with the fact that VRFs (like interfaces) are not actually getting deleted when they are removed - they remain present. This leads to situations in which BGP may try to unlink more than once, which messes up the reference count (lock) in the BGP instance. Signed-off-by: Vivek Venkatraman Reviewed-by: Donald Sharp Ticket: CM-9419 Reviewed By: CCR-4302 Testing Done: Manual, also verified by Atul --- diff --git a/bgpd/bgpd.h b/bgpd/bgpd.h index 3a0a679d6f..240694bb6d 100644 --- a/bgpd/bgpd.h +++ b/bgpd/bgpd.h @@ -1458,17 +1458,22 @@ static inline void bgp_vrf_link (struct bgp *bgp, struct vrf *vrf) { bgp->vrf_id = vrf->vrf_id; - bgp_lock (bgp); - vrf->info = (void *)bgp; - + if (vrf->info != (void *)bgp) + { + bgp_lock (bgp); + vrf->info = (void *)bgp; + } } /* Unlink BGP instance from VRF. */ static inline void bgp_vrf_unlink (struct bgp *bgp, struct vrf *vrf) { - vrf->info = NULL; - bgp_unlock (bgp); + if (vrf->info == (void *)bgp) + { + vrf->info = NULL; + bgp_unlock (bgp); + } bgp->vrf_id = VRF_DEFAULT; }