From: Paul Jakma Date: Sun, 2 Jul 2006 11:01:50 +0000 (+0000) Subject: [bgpd] Fix crash on shutdown of peer X-Git-Tag: frr-2.0-rc1~2651 X-Git-Url: https://git.puffer.fish/?a=commitdiff_plain;h=33d5ab9ef197ce281859f12251df4e412c469c65;p=mirror%2Ffrr.git [bgpd] Fix crash on shutdown of peer 2006-07-02 Paul Jakma * bgp_fsm.c: (bgp_{stop,start}) Move clear/free of certain bits of state from stop to start, as they may be used via peer references on clearing queues.. --- diff --git a/bgpd/ChangeLog b/bgpd/ChangeLog index 5176e2b686..a8a6c35002 100644 --- a/bgpd/ChangeLog +++ b/bgpd/ChangeLog @@ -1,3 +1,9 @@ +2006-07-02 Paul Jakma + + * bgp_fsm.c: (bgp_{stop,start}) Move clear/free of certain + bits of state from stop to start, as they may be used via + peer references on clearing queues.. + 2006-05-23 Paul Jakma * bgp_vty.c: (neighbor_update_source_cmd) Expand tab completion diff --git a/bgpd/bgp_fsm.c b/bgpd/bgp_fsm.c index f5f7892bbf..770a791196 100644 --- a/bgpd/bgp_fsm.c +++ b/bgpd/bgp_fsm.c @@ -511,25 +511,6 @@ bgp_stop (struct peer *peer) peer->fd = -1; } - /* Connection information. */ - if (peer->su_local) - { - sockunion_free (peer->su_local); - peer->su_local = NULL; - } - - if (peer->su_remote) - { - sockunion_free (peer->su_remote); - peer->su_remote = NULL; - } - - /* Clear remote router-id. */ - peer->remote_id.s_addr = 0; - - /* Clear peer capability flag. */ - peer->cap = 0; - for (afi = AFI_IP ; afi < AFI_MAX ; afi++) for (safi = SAFI_UNICAST ; safi < SAFI_MAX ; safi++) { @@ -644,6 +625,28 @@ bgp_start (struct peer *peer) { int status; + /* Scrub some information that might be left over from a previous, + * session + */ + /* Connection information. */ + if (peer->su_local) + { + sockunion_free (peer->su_local); + peer->su_local = NULL; + } + + if (peer->su_remote) + { + sockunion_free (peer->su_remote); + peer->su_remote = NULL; + } + + /* Clear remote router-id. */ + peer->remote_id.s_addr = 0; + + /* Clear peer capability flag. */ + peer->cap = 0; + /* If the peer is passive mode, force to move to Active mode. */ if (CHECK_FLAG (peer->flags, PEER_FLAG_PASSIVE)) {