]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
Fixes race condition leading to memory corruption and crash.
authorOndrej Zajicek <santiago@crfreenet.org>
Sat, 22 Nov 2008 00:12:22 +0000 (01:12 +0100)
committerOndrej Zajicek <santiago@crfreenet.org>
Sat, 22 Nov 2008 00:12:22 +0000 (01:12 +0100)
When protocol started, feeding was scheduled. If protocol
got down before feeding was executed, then function
responsible for connecting protocol to kernel routing
tables was called after the function responsible for
disconnecting, then resource pool of protocol was freed,
but freed linked list structures remains in the list.

nest/proto.c

index fb24e5736a3f1e241d93e778b49ec91c6fd4e8e5..6c89f7e010ddc83cd23048d93c6b5d928d53b5eb 100644 (file)
@@ -521,9 +521,10 @@ proto_feed_more(void *P)
 {
   struct proto *p = P;
 
-  DBG("Feeding protocol %s continued\n", p->name);
   if (p->core_state != FS_FEEDING)
     return;
+
+  DBG("Feeding protocol %s continued\n", p->name);
   if (rt_feed_baby(p))
     {
       p->core_state = FS_HAPPY;
@@ -542,6 +543,9 @@ proto_feed(void *P)
 {
   struct proto *p = P;
 
+  if (p->core_state != FS_FEEDING)
+    return;
+
   DBG("Feeding protocol %s\n", p->name);
   proto_add_announce_hook(p, p->table);
   if_feed_baby(p);