From 7cf7f976758838c806c52352165ab3f57c89150c Mon Sep 17 00:00:00 2001 From: Luiz Augusto von Dentz Date: Thu, 22 May 2014 13:23:35 +0300 Subject: [PATCH] shared/queue: Fix queue_foreach not detecting queue has changed This fixes queue_foreach crashing if callback calls queue_remove_all. --- src/shared/queue.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/shared/queue.c b/src/shared/queue.c index c9c08120a..20f51b8ab 100644 --- a/src/shared/queue.c +++ b/src/shared/queue.c @@ -187,6 +187,17 @@ void *queue_peek_tail(struct queue *queue) return queue->tail->data; } +static bool queue_find_entry(struct queue *queue, const void *data) +{ + struct queue_entry *entry; + + for (entry = queue->head; entry; entry = entry->next) + if (entry == data) + return true; + + return false; +} + void queue_foreach(struct queue *queue, queue_foreach_func_t function, void *user_data) { @@ -206,6 +217,9 @@ void queue_foreach(struct queue *queue, queue_foreach_func_t function, entry = tmp->next; function(tmp->data, user_data); + + if (!queue_find_entry(queue, entry)) + break; } queue_unref(queue); } -- 2.47.3