[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..
diff --git a/bgpd/ChangeLog b/bgpd/ChangeLog
index 5176e2b..a8a6c35 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 f5f7892..770a791 100644
--- a/bgpd/bgp_fsm.c
+++ b/bgpd/bgp_fsm.c
@@ -511,25 +511,6 @@
       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 @@
 {
   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))
     {