From eecfe653e39c6bc336e693c3f8362f209ce9bfa3 Mon Sep 17 00:00:00 2001 From: Danila Fedorin Date: Thu, 8 Feb 2018 18:40:56 -0800 Subject: [PATCH] Fix incorrect deletion code. --- src/eval.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/eval.c b/src/eval.c index 0a062be..c3805f9 100644 --- a/src/eval.c +++ b/src/eval.c @@ -50,16 +50,18 @@ liblex_result _eval_config_free_state(eval_state* state) { liblex_result eval_config_remove(eval_config* config, const char* pattern, int pattern_id) { liblex_result result = LIBLEX_SUCCESS; - ll_node** head = &(config->states.head); - while(*head && result == LIBLEX_SUCCESS) { - eval_state* current_state = (*head)->data; + ll_node* head = config->states.head; + while(head && result == LIBLEX_SUCCESS) { + eval_state* current_state = head->data; if(strcmp(current_state->source, pattern) == 0 && current_state->pattern->head->pattern_id == pattern_id) { - ll_node* to_delete = *head; - (*head) = (*head)->next; + ll_node* to_delete = head; + head = head->next; + *(to_delete->prev ? &to_delete->prev->next : &(config->states.head)) = to_delete->next; + *(to_delete->next ? &to_delete->next->prev : &(config->states.tail)) = to_delete->prev; free(to_delete); result = _eval_config_free_state(current_state); } else { - head = &((*head)->next); + head = head->next; } } return result;