aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/libstrongswan/utils/linked_list.c34
1 files changed, 23 insertions, 11 deletions
diff --git a/src/libstrongswan/utils/linked_list.c b/src/libstrongswan/utils/linked_list.c
index ee46b2b8c..cab6d8635 100644
--- a/src/libstrongswan/utils/linked_list.c
+++ b/src/libstrongswan/utils/linked_list.c
@@ -149,9 +149,9 @@ struct private_enumerator_t {
enumerator_t enumerator;
/**
- * next item to enumerate
+ * associated linked list
*/
- element_t *next;
+ private_linked_list_t *list;
/**
* current item
@@ -164,13 +164,23 @@ struct private_enumerator_t {
*/
static bool enumerate(private_enumerator_t *this, void **item)
{
- if (this->next == NULL)
+ if (!this->current)
+ {
+ if (!this->list->first)
+ {
+ return FALSE;
+ }
+ this->current = this->list->first;
+ }
+ else
{
- return FALSE;
+ if (!this->current->next)
+ {
+ return FALSE;
+ }
+ this->current = this->current->next;
}
- *item = this->next->value;
- this->current = this->next;
- this->next = this->next->next;
+ *item = this->current->value;
return TRUE;
}
@@ -183,7 +193,7 @@ static enumerator_t* create_enumerator(private_linked_list_t *this)
enumerator->enumerator.enumerate = (void*)enumerate;
enumerator->enumerator.destroy = (void*)free;
- enumerator->next = this->first;
+ enumerator->list = this;
enumerator->current = NULL;
return &enumerator->enumerator;
@@ -602,11 +612,13 @@ static int remove(private_linked_list_t *this, void *item,
*/
static void remove_at(private_linked_list_t *this, private_enumerator_t *enumerator)
{
+ element_t *current;
+
if (enumerator->current)
{
- remove_element(this, enumerator->current);
- enumerator->current = NULL;
- enumerator->next = this->first;
+ current = enumerator->current;
+ enumerator->current = current->previous;
+ remove_element(this, current);
}
}