summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOndrej Zajicek <santiago@crfreenet.org>2008-12-24 12:18:10 +0100
committerOndrej Zajicek <santiago@crfreenet.org>2008-12-24 12:18:10 +0100
commit591211557f4106ed9e877fa9b80eb56ffb99fef3 (patch)
treec6c489da2fa363570aad3dac570950bcb5441b5e
parent11b32d911715cbfb3ce4c87685b1388e4b0de1c4 (diff)
downloadbird-591211557f4106ed9e877fa9b80eb56ffb99fef3.tar
bird-591211557f4106ed9e877fa9b80eb56ffb99fef3.zip
Fixes bug related to reconfiguration of BGP.
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.
-rw-r--r--proto/bgp/bgp.c12
1 files changed, 9 insertions, 3 deletions
diff --git a/proto/bgp/bgp.c b/proto/bgp/bgp.c
index 46b2890..d1b7dee 100644
--- a/proto/bgp/bgp.c
+++ b/proto/bgp/bgp.c
@@ -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 = {