diff options
author | Paul Jakma <paul.jakma@sun.com> | 2006-07-02 11:01:50 +0000 |
---|---|---|
committer | Paul Jakma <paul.jakma@sun.com> | 2006-07-02 11:01:50 +0000 |
commit | 33d5ab9ef197ce281859f12251df4e412c469c65 (patch) | |
tree | e33b0687ecc11d38b11bc53774e095298cc22c5e | |
parent | 9a57dc69d2432b6633fc47b05d4ee475a29db361 (diff) |
[bgpd] Fix crash on shutdown of peer
2006-07-02 Paul Jakma <paul.jakma@sun.com>
* 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..
-rw-r--r-- | bgpd/ChangeLog | 6 | ||||
-rw-r--r-- | bgpd/bgp_fsm.c | 41 |
2 files changed, 28 insertions, 19 deletions
diff --git a/bgpd/ChangeLog b/bgpd/ChangeLog index 5176e2b6..a8a6c350 100644 --- a/bgpd/ChangeLog +++ b/bgpd/ChangeLog @@ -1,3 +1,9 @@ +2006-07-02 Paul Jakma <paul.jakma@sun.com> + + * 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 <paul.jakma@sun.com> * bgp_vty.c: (neighbor_update_source_cmd) Expand tab completion diff --git a/bgpd/bgp_fsm.c b/bgpd/bgp_fsm.c index f5f7892b..770a7911 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)) { |