diff --git a/ChangeLog b/ChangeLog index 2a19aa49..8d203f21 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +2010-03-20 Nicolas François + + * lib/groupio.c: Fix memory management insplit_groups(). + 2010-03-20 Nicolas François * libmisc/strtoday.c: Empty dates indicate a disabled date, this is diff --git a/lib/groupio.c b/lib/groupio.c index feb90605..9ddca70c 100644 --- a/lib/groupio.c +++ b/lib/groupio.c @@ -382,6 +382,7 @@ static int split_groups (unsigned int max_members) struct commonio_entry *new; struct group *new_gptr; unsigned int members = 0; + int i; /* Check if this group must be split */ if (!gr->changed) @@ -408,9 +409,23 @@ static int split_groups (unsigned int max_members) new->changed = true; /* Enforce the maximum number of members on gptr */ - gptr->gr_mem[max_members] = NULL; + for (i = max_members; NULL != gptr->gr_mem[i]; i++) { + free (gptr->gr_mem[i]); + gptr->gr_mem[i] = NULL; + } + /* Shift all the members */ /* The number of members in new_gptr will be check later */ - new_gptr->gr_mem = &new_gptr->gr_mem[max_members]; + for (i = 0; NULL != new_gptr->gr_mem[i + max_members]; i++) { + if (NULL != new_gptr->gr_mem[i]) { + free (new_gptr->gr_mem[i]); + } + new_gptr->gr_mem[i] = new_gptr->gr_mem[i + max_members]; + new_gptr->gr_mem[i + max_members] = NULL; + } + for (; NULL != new_gptr->gr_mem[i]; i++) { + free (new_gptr->gr_mem[i]); + new_gptr->gr_mem[i] = NULL; + } /* insert the new entry in the list */ new->prev = gr;