]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
Fixes bug related to reconfiguration of BGP.
authorOndrej Zajicek <santiago@crfreenet.org>
Wed, 24 Dec 2008 11:18:10 +0000 (12:18 +0100)
committerOndrej Zajicek <santiago@crfreenet.org>
Wed, 24 Dec 2008 11:18:10 +0000 (12:18 +0100)
BGP keeps its copy of configuration ptr and didn't update it during
reconfiguration. But old configuration is freed during reconfiguration.
That leads to unnecessary reset of BGP connection during reconfiguration
(old conf is corrupted and therefore different) and possibly other strange
behavior.

proto/bgp/bgp.c

index 46b28906a8cbd2839544aa816015c2ef88bfcf1e..d1b7dee9429b6cf7c42872d703bdff12565611fe 100644 (file)
@@ -876,9 +876,15 @@ bgp_reconfigure(struct proto *P, struct proto_config *C)
   struct bgp_proto *p = (struct bgp_proto *) P;
   struct bgp_config *old = p->cf;
 
-  return !memcmp(((byte *) old) + sizeof(struct proto_config),
-                ((byte *) new) + sizeof(struct proto_config),
-                sizeof(struct bgp_config) - sizeof(struct proto_config));
+  int same = !memcmp(((byte *) old) + sizeof(struct proto_config),
+                    ((byte *) new) + sizeof(struct proto_config),
+                    sizeof(struct bgp_config) - sizeof(struct proto_config));
+
+  /* We should update our copy of configuration ptr as old configuration will be freed */
+  if (same)
+    p->cf = new;
+
+  return same;
 }
 
 struct protocol proto_bgp = {