From bde826b18aeb6fd3c9de7a7733d1e163efde90e1 Mon Sep 17 00:00:00 2001 From: Paul Smith Date: Fri, 17 Feb 2006 13:29:52 +0000 Subject: Make sure we don't introduce a circularity into the variable set linked list. Fixes Savannah bug #15757. --- variable.c | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) (limited to 'variable.c') diff --git a/variable.c b/variable.c index 0ea71cd..39f0ada 100644 --- a/variable.c +++ b/variable.c @@ -665,21 +665,27 @@ void merge_variable_set_lists (struct variable_set_list **setlist0, struct variable_set_list *setlist1) { - register struct variable_set_list *list0 = *setlist0; + struct variable_set_list *to = *setlist0; struct variable_set_list *last0 = 0; - while (setlist1 != 0 && list0 != 0) + /* If there's nothing to merge, stop now. */ + if (!setlist1) + return; + + /* This loop relies on the fact that all setlists terminate with the global + setlist (before NULL). If that's not true, arguably we SHOULD die. */ + while (setlist1 != &global_setlist && to != &global_setlist) { - struct variable_set_list *next = setlist1; + struct variable_set_list *from = setlist1; setlist1 = setlist1->next; - merge_variable_sets (list0->set, next->set); + merge_variable_sets (to->set, from->set); - last0 = list0; - list0 = list0->next; + last0 = to; + to = to->next; } - if (setlist1 != 0) + if (setlist1 != &global_setlist) { if (last0 == 0) *setlist0 = setlist1; -- cgit v1.2.3