]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
Nest: fixed corner cases on deleting from fib mq-ordered
authorMaria Matejka <mq@ucw.cz>
Wed, 16 Jan 2019 15:39:29 +0000 (16:39 +0100)
committerJan Maria Matejka <mq@ucw.cz>
Thu, 17 Jan 2019 09:40:45 +0000 (10:40 +0100)
nest/rt-fib.c

index e136035751567570ba70b9509c1c331aa29638d6..d9afccb2a6b06fdb4d8c5bde176d9c6cd4fa40aa 100644 (file)
@@ -426,13 +426,13 @@ fib_delete(struct fib *f, void *E)
        }
 #undef UNDEF
 
+      REDBLACK_DELETE(struct fib_node, rb, f->tree_root, e);
+
       if (f->fib_slab)
        sl_free(f->fib_slab, E);
       else
        mb_free(E);
 
-      REDBLACK_DELETE(struct fib_node, rb, f->tree_root, e);
-
       if (f->entries-- < f->entries_min)
        fib_rehash(f, -HASH_LO_STEP);
       return;
@@ -503,14 +503,20 @@ fit_get(struct fib *f, struct fib_iterator *i)
 void
 fit_put(struct fib_iterator *i, struct fib_node *n)
 {
-  struct fib_iterator *j;
-
   i->node = n;
-  if (j = n->readers)
-    j->prev = i;
-  i->next = j;
-  n->readers = i;
   i->prev = (struct fib_iterator *) n;
+
+  if (!n)
+    {
+      i->next = NULL;
+      return;
+    }
+
+  i->next = n->readers;
+  n->readers = i;
+
+  if (i->next)
+    i->next->prev = i;
 }
 
 void