From bbcfac20a69bbd2af8d46cc498116b0b4798262d Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Wed, 26 Mar 2025 11:18:40 -0400 Subject: [PATCH 1/2] prioq: invalidate index pointers on removal --- src/basic/prioq.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/basic/prioq.c b/src/basic/prioq.c index b3cf88ecad..194bd5e7eb 100644 --- a/src/basic/prioq.c +++ b/src/basic/prioq.c @@ -46,6 +46,11 @@ Prioq* prioq_free(Prioq *q) { if (!q) return NULL; + /* Invalidate the index fields of any remaining objects */ + FOREACH_ARRAY(item, q->items, q->n_items) + if (item->idx) + *(item->idx) = PRIOQ_IDX_NULL; + free(q->items); return mfree(q); } @@ -178,6 +183,11 @@ static void remove_item(Prioq *q, struct prioq_item *i) { assert(q); assert(i); + /* Let's invalidate the index pointer stored in the user's object to indicate the item is now removed + * from the priority queue */ + if (i->idx) + *(i->idx) = PRIOQ_IDX_NULL; + l = q->items + q->n_items - 1; if (i == l) From 39ce0324f94b928dae1889736a3638ee4a470aa9 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Wed, 26 Mar 2025 11:19:05 -0400 Subject: [PATCH 2/2] prioq: add some minor overflow checking assert()s --- src/basic/prioq.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/basic/prioq.c b/src/basic/prioq.c index 194bd5e7eb..b3fec89f76 100644 --- a/src/basic/prioq.c +++ b/src/basic/prioq.c @@ -199,6 +199,7 @@ static void remove_item(Prioq *q, struct prioq_item *i) { /* Not last entry, let's replace the last entry with * this one, and reshuffle */ + assert(i >= q->items); k = i - q->items; i->data = l->data; @@ -262,6 +263,7 @@ void prioq_reshuffle(Prioq *q, void *data, unsigned *idx) { if (!i) return; + assert(i >= q->items); k = i - q->items; k = shuffle_down(q, k); shuffle_up(q, k);