* bgpd.c: Removal of (struct bgp *) from the master list was being left to
bgp_free time. This meant there was a window of time between bgp_delete
and refcounts hitting 0 (e.g. routes to be processed) where bgp_lookup's
could return a deleted (struct bgp *).
(bgp_delete) This is the logical place where a (struct bgp *) should lose
its visibility, so move the deletion from the bgp-master list to here,
from bgp_free.
Many thanks to Fritz Reichmann for his thorough debugging of the problem
and testing of fixes and Chris Caputo for his further analysis.
peer_delete(bgp->peer_self);
bgp->peer_self = NULL;
}
-
+
+ /* Remove visibility via the master list - there may however still be
+ * routes to be processed still referencing the struct bgp.
+ */
+ listnode_delete (bm->bgp, bgp);
+
bgp_unlock(bgp); /* initial reference */
-
+
return 0;
}
list_delete (bgp->peer);
list_delete (bgp->rsclient);
- listnode_delete (bm->bgp, bgp);
-
if (bgp->name)
free (bgp->name);