]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
BGP: Cleanup channels when going down
authorOndrej Zajicek (work) <santiago@crfreenet.org>
Mon, 28 Jan 2019 14:23:54 +0000 (15:23 +0100)
committerOndrej Zajicek (work) <santiago@crfreenet.org>
Mon, 28 Jan 2019 14:23:54 +0000 (15:23 +0100)
When going up, uncleaned old channel state may trigger unexpected
conditions crashing bird.

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

index 0e60d88d86bde1d7b70dc2d839a695ba6a8e460e..9eb24bec95d78f141e9bb39071f41fb2ae92ac15 100644 (file)
@@ -1576,6 +1576,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 3a1efc8ccbac68eff755bc606e29dbf37b246c6c..27d9350a28924c3f7c6fc61978b4ea01f788044f 100644 (file)
@@ -282,12 +282,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) */
@@ -295,8 +299,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 */