]> granicus.if.org Git - shadow/commitdiff
* lib/groupio.c: Fix memory management insplit_groups().
authornekral-guest <nekral-guest@5a98b0ae-9ef6-0310-add3-de5d479b70d7>
Sat, 20 Mar 2010 10:21:40 +0000 (10:21 +0000)
committernekral-guest <nekral-guest@5a98b0ae-9ef6-0310-add3-de5d479b70d7>
Sat, 20 Mar 2010 10:21:40 +0000 (10:21 +0000)
ChangeLog
lib/groupio.c

index 2a19aa4911d9207876926b7f9d5efb2735576215..8d203f21102218f8d5eb1b7160c92b8cac153f05 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2010-03-20  Nicolas François  <nicolas.francois@centraliens.net>
+
+       * lib/groupio.c: Fix memory management insplit_groups().
+
 2010-03-20  Nicolas François  <nicolas.francois@centraliens.net>
 
        * libmisc/strtoday.c: Empty dates indicate a disabled date, this is
index feb906056e55106bb39f01999fc29f2ac46d8729..9ddca70c11435ca27c3935fd24ffc3b9bb3deb1d 100644 (file)
@@ -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;