diff options
author | Stephen Hemminger <stephen.hemminger@vyatta.com> | 2008-06-16 18:01:49 -0700 |
---|---|---|
committer | Stephen Hemminger <stephen.hemminger@vyatta.com> | 2008-06-16 18:01:49 -0700 |
commit | cd03c5df4248d1201a7f289672039e05f09f1ae4 (patch) | |
tree | 056ec3260191fa342a7fca9b0769dddee6104cec | |
parent | 7d4f6603c5e333917ec70986f32ef0661cce318a (diff) | |
download | quagga-cd03c5df4248d1201a7f289672039e05f09f1ae4.tar.bz2 quagga-cd03c5df4248d1201a7f289672039e05f09f1ae4.tar.xz |
Fix double free of bgp_table
If route server client is being used, then peer->rib entry
would get freed twice.
-rw-r--r-- | bgpd/bgp_vty.c | 3 | ||||
-rw-r--r-- | bgpd/bgpd.c | 6 |
2 files changed, 7 insertions, 2 deletions
diff --git a/bgpd/bgp_vty.c b/bgpd/bgp_vty.c index d42f8121..0e689359 100644 --- a/bgpd/bgp_vty.c +++ b/bgpd/bgp_vty.c @@ -2193,7 +2193,8 @@ peer_rsclient_unset_vty (struct vty *vty, const char *peer_str, listnode_delete (bgp->rsclient, peer); } - bgp_table_finish (peer->rib[bgp_node_afi(vty)][bgp_node_safi(vty)]); + bgp_table_finish (peer->rib[afi][safi]); + peer->rib[afi][safi] = NULL; return CMD_SUCCESS; } diff --git a/bgpd/bgpd.c b/bgpd/bgpd.c index c4e54f03..b37e577d 100644 --- a/bgpd/bgpd.c +++ b/bgpd/bgpd.c @@ -1243,7 +1243,10 @@ peer_delete (struct peer *peer) for (afi = AFI_IP; afi < AFI_MAX; afi++) for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++) if (peer->rib[afi][safi] && ! peer->af_group[afi][safi]) - bgp_table_finish (peer->rib[afi][safi]); + { + bgp_table_finish (peer->rib[afi][safi]); + peer->rib[afi][safi] = NULL; + } /* Buffers. */ if (peer->ibuf) @@ -1835,6 +1838,7 @@ peer_group_bind (struct bgp *bgp, union sockunion *su, } bgp_table_finish (peer->rib[afi][safi]); + peer->rib[afi][safi] = NULL; /* Import policy. */ if (peer->filter[afi][safi].map[RMAP_IMPORT].name) |