summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMaria Matejka <mq@ucw.cz>2023-02-02 13:26:49 +0100
committerMaria Matejka <mq@ucw.cz>2023-02-02 15:57:21 +0100
commit226839c97731394b98cc8c7421a152964061c1aa (patch)
tree68858a391dc7674109158ff52a0f68f594c4fb2d
parentc354e8f4c199ca7dec441394156d18badac71b81 (diff)
Lists: fixed bugs in expensive checks in quirky usecases
-rw-r--r--lib/lists.c9
1 files changed, 5 insertions, 4 deletions
diff --git a/lib/lists.c b/lib/lists.c
index 200576cf..2f32a5e1 100644
--- a/lib/lists.c
+++ b/lib/lists.c
@@ -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;