]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
Fixing expensive list checks. Debug only commit.
authorMaria Matejka <mq@ucw.cz>
Mon, 9 Aug 2021 09:51:19 +0000 (11:51 +0200)
committerMaria Matejka <mq@ucw.cz>
Mon, 22 Nov 2021 18:05:43 +0000 (19:05 +0100)
lib/lists.c

index fe2b692b26be833747192be90896f0c4c8ab0eda..58d5107396820c04df5a753301f13790afdab170 100644 (file)
@@ -35,11 +35,12 @@ check_list(list *l, node *n)
   if (!l)
   {
     ASSERT_DIE(n);
-    ASSERT_DIE(n->prev);
 
-    do { n = n->prev; } while (n->prev);
+    node *nn = n;
+    while (nn->prev)
+      nn = nn->prev;
 
-    l = SKIP_BACK(list, head_node, n);
+    l = SKIP_BACK(list, head_node, nn);
   }
 
   int seen = 0;
@@ -60,7 +61,7 @@ check_list(list *l, node *n)
   }
 
   ASSERT_DIE(cur == &(l->tail_node));
-  ASSERT_DIE(!n || (seen == 1));
+  ASSERT_DIE(!n || (seen == 1) || (n == &l->head_node) || (n == &l->tail_node));
 
   return 1;
 }
@@ -129,7 +130,7 @@ self_link(node *n)
 LIST_INLINE void
 insert_node(node *n, node *after)
 {
-  EXPENSIVE_CHECK(check_list(l, after));
+  EXPENSIVE_CHECK(check_list(NULL, after));
   ASSUME(n->prev == NULL);
   ASSUME(n->next == NULL);
 
@@ -150,7 +151,7 @@ insert_node(node *n, node *after)
 LIST_INLINE void
 rem_node(node *n)
 {
-  EXPENSIVE_CHECK(check_list(NULL, n));
+  EXPENSIVE_CHECK((n == n->prev) && (n == n->next) || check_list(NULL, n));
 
   node *z = n->prev;
   node *x = n->next;