X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Flibgame%2Fmisc.c;h=3bc3299f2c70fcb5ad5427f2709021bdaa66d838;hb=7a705013e74fff7fb43ea9dd6359d033f4b0aa3f;hp=be7fdc38e7819f5077fcfa223107d55081d511b2;hpb=f2ddf39ad776c01f9b8a57818fe3ea9777649778;p=rocksndiamonds.git diff --git a/src/libgame/misc.c b/src/libgame/misc.c index be7fdc38..3bc3299f 100644 --- a/src/libgame/misc.c +++ b/src/libgame/misc.c @@ -2068,20 +2068,33 @@ void deleteNodeFromList(ListNode **node_first, char *key, if (strEqual((*node_first)->key, key)) { - checked_free((*node_first)->key); + // after first recursion, (*node_first)->prev->next == *node_first, + // so *node_first would be overwritten with (*node_first)->next + // => use a copy of *node_first (and later of (*node_first)->next) + ListNode *node = *node_first; + ListNode *node_next = node->next; + + checked_free(node->key); if (destructor_function) - destructor_function((*node_first)->content); + destructor_function(node->content); + + if (node->prev) + node->prev->next = node->next; - if ((*node_first)->next) - (*node_first)->next->prev = (*node_first)->prev; + if (node->next) + node->next->prev = node->prev; - checked_free(*node_first); + checked_free(node); - *node_first = (*node_first)->next; + // after removing node, set list pointer to next valid list node + // (this is important if the first node of the list was deleted) + *node_first = node_next; } else + { deleteNodeFromList(&(*node_first)->next, key, destructor_function); + } } ListNode *getNodeFromKey(ListNode *node_first, char *key) @@ -3082,7 +3095,7 @@ static void LoadArtworkConfigFromFilename(struct ArtworkListInfo *artwork_info, } END_HASH_ITERATION(valid_file_hash_tmp, itr) - /* free temporary hash used for iteration */ + /* free temporary hash used for iteration */ freeSetupFileHash(valid_file_hash_tmp); /* read parameters for all known config file tokens */