summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStephen Hemminger <stephen.hemminger@vyatta.com>2008-06-16 18:01:49 -0700
committerStephen Hemminger <stephen.hemminger@vyatta.com>2008-06-16 18:01:49 -0700
commitcd03c5df4248d1201a7f289672039e05f09f1ae4 (patch)
tree056ec3260191fa342a7fca9b0769dddee6104cec
parent7d4f6603c5e333917ec70986f32ef0661cce318a (diff)
downloadquagga-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.c3
-rw-r--r--bgpd/bgpd.c6
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)