From 3b449ce854e8d1a067142b9914294e785050b025 Mon Sep 17 00:00:00 2001 From: Martin Willi Date: Thu, 2 Nov 2006 14:25:58 +0000 Subject: [PATCH] fixed very old bug in linked_list's remove_first and remove_last --- src/libstrongswan/utils/linked_list.c | 28 +++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/src/libstrongswan/utils/linked_list.c b/src/libstrongswan/utils/linked_list.c index daf07e210..8c5068870 100644 --- a/src/libstrongswan/utils/linked_list.c +++ b/src/libstrongswan/utils/linked_list.c @@ -392,12 +392,12 @@ static void insert_first(private_linked_list_t *this, void *item) */ static status_t remove_first(private_linked_list_t *this, void **item) { - if (this->count == 0) + element_t *element = this->first; + + if (element == NULL) { return NOT_FOUND; } - - element_t *element = this->first; if (element->next != NULL) { element->next->previous = NULL; @@ -408,8 +408,13 @@ static status_t remove_first(private_linked_list_t *this, void **item) { *item = element->value; } - this->count--; + if (--this->count == 0) + { + this->last = NULL; + } + free(element); + return SUCCESS; } @@ -457,26 +462,29 @@ static void insert_last(private_linked_list_t *this, void *item) */ static status_t remove_last(private_linked_list_t *this, void **item) { - if (this->count == 0) + element_t *element = this->last; + + if (element == NULL) { return NOT_FOUND; } - - element_t *element = this->last; - if (element->previous != NULL) { element->previous->next = NULL; } this->last = element->previous; - + if (item != NULL) { *item = element->value; } + if (--this->count == 0) + { + this->first = NULL; + } - this->count--; free(element); + return SUCCESS; }