]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
BGP: Cleanup channels when going down
authorOndrej Zajicek (work) <santiago@crfreenet.org>
Sat, 26 Jan 2019 18:48:16 +0000 (19:48 +0100)
committerOndrej Zajicek (work) <santiago@crfreenet.org>
Sat, 26 Jan 2019 18:48:16 +0000 (19:48 +0100)
When going up, uncleaned old channel state may trigger unexpected
conditions crashing bird.

proto/bgp/bgp.c
proto/bgp/bgp.h

index 43f9f134228a3229c5f1aaf05e7e75226eaca2d9..8dedde9f782d485e770366d87f4c55e992c18895 100644 (file)
@@ -1692,6 +1692,11 @@ bgp_channel_cleanup(struct channel *C)
 
   if (c->igp_table_ip6)
     rt_unlock_table(c->igp_table_ip6);
+
+  c->index = 0;
+
+  /* Cleanup rest of bgp_channel starting at pool field */
+  memset(&(c->pool), 0, sizeof(struct bgp_channel) - OFFSETOF(struct bgp_channel, pool));
 }
 
 static inline struct bgp_channel_config *
index 2b60f90f2842f7c771950f1005397a362b010120..cfc88d8e1e4bbaadc6ffc4c2aa1584262aa70a13 100644 (file)
@@ -299,12 +299,16 @@ struct bgp_channel {
 
   /* Rest are BGP specific data */
   struct bgp_channel_config *cf;
-  pool *pool; /* XXXX */
 
   u32 afi;
   u32 index;
   const struct bgp_af_desc *desc;
 
+  rtable *igp_table_ip4;               /* Table for recursive IPv4 next hop lookups */
+  rtable *igp_table_ip6;               /* Table for recursive IPv6 next hop lookups */
+
+  /* Rest are zeroed when down */
+  pool *pool;
   HASH(struct bgp_bucket) bucket_hash; /* Hash table of route buckets */
   struct bgp_bucket *withdraw_bucket;  /* Withdrawn routes */
   list bucket_queue;                   /* Queue of buckets to send (struct bgp_bucket) */
@@ -312,8 +316,6 @@ struct bgp_channel {
   HASH(struct bgp_prefix) prefix_hash; /* Prefixes to be sent */
   slab *prefix_slab;                   /* Slab holding prefix nodes */
 
-  rtable *igp_table_ip4;               /* Table for recursive IPv4 next hop lookups */
-  rtable *igp_table_ip6;               /* Table for recursive IPv6 next hop lookups */
   ip_addr next_hop_addr;               /* Local address for NEXT_HOP attribute */
   ip_addr link_addr;                   /* Link-local version of next_hop_addr */