]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
Lists: fixed bugs in expensive checks in quirky usecases
authorMaria Matejka <mq@ucw.cz>
Thu, 2 Feb 2023 12:26:49 +0000 (13:26 +0100)
committerMaria Matejka <mq@ucw.cz>
Thu, 2 Feb 2023 14:57:21 +0000 (15:57 +0100)
lib/lists.c

index 200576cf659c18153c9e7cc270943d00dc9138c2..2f32a5e17fd4d455a73a43ebe868a4eec7712cf3 100644 (file)
@@ -37,9 +37,10 @@ check_list(list *l, node *n)
     ASSERT_DIE(n);
     ASSERT_DIE(n->prev);
 
-    do { n = n->prev; } while (n->prev);
+    node *nn = n;
+    do { nn = nn->prev; } while (nn->prev);
 
-    l = SKIP_BACK(list, head_node, n);
+    l = SKIP_BACK(list, head_node, nn);
   }
 
   int seen = 0;
@@ -120,7 +121,7 @@ add_head(list *l, node *n)
 LIST_INLINE void
 insert_node(node *n, node *after)
 {
-  EXPENSIVE_CHECK(check_list(l, after));
+  EXPENSIVE_CHECK((after->prev == NULL) || check_list(NULL, after));
   ASSUME(n->prev == NULL);
   ASSUME(n->next == NULL);
 
@@ -141,7 +142,7 @@ insert_node(node *n, node *after)
 LIST_INLINE void
 rem_node(node *n)
 {
-  EXPENSIVE_CHECK(check_list(NULL, n));
+  EXPENSIVE_CHECK((n->prev == n) && (n->next == n) || check_list(NULL, n));
 
   node *z = n->prev;
   node *x = n->next;