From 864f52a5f4c47ac8dc44a8808beb7f038cbf9899 Mon Sep 17 00:00:00 2001 From: Ondrej Zajicek Date: Wed, 2 Apr 2014 19:58:23 +0200 Subject: Fixes nasty bug in BFD. When a BFD session is removed while being scheduled for notification, the session stays in notify list and is removed twice, which leads to a strange crash after a while. --- proto/bfd/bfd.c | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'proto') diff --git a/proto/bfd/bfd.c b/proto/bfd/bfd.c index 315d132b..7bbe8c21 100644 --- a/proto/bfd/bfd.c +++ b/proto/bfd/bfd.c @@ -477,8 +477,15 @@ bfd_remove_session(struct bfd_proto *p, struct bfd_session *s) { ip_addr ip = s->addr; + /* Caller should ensure that request list is empty */ + birdloop_enter(p->loop); + /* Remove session from notify list if scheduled for notification */ + /* No need for bfd_lock_sessions(), we are already protected by birdloop_enter() */ + if (NODE_VALID(&s->n)) + rem_node(&s->n); + bfd_free_iface(s->ifa); rfree(s->tx_timer); -- cgit v1.2.3