Index: shadow-4.5/src/grpconv.c =================================================================== --- shadow-4.5.orig/src/grpconv.c +++ shadow-4.5/src/grpconv.c @@ -143,6 +143,7 @@ int main (int argc, char **argv) struct group grent; const struct sgrp *sg; struct sgrp sgent; + char *np; Prog = Basename (argv[0]); @@ -184,20 +185,25 @@ int main (int argc, char **argv) * Remove /etc/gshadow entries for groups not in /etc/group. */ (void) sgr_rewind (); - while ((sg = sgr_next ()) != NULL) { - if (gr_locate (sg->sg_name) != NULL) { - continue; - } - - if (sgr_remove (sg->sg_name) == 0) { - /* - * This shouldn't happen (the entry exists) but... - */ - fprintf (stderr, - _("%s: cannot remove entry '%s' from %s\n"), - Prog, sg->sg_name, sgr_dbname ()); - fail_exit (3); + sg = sgr_next (); + np=NULL; + while (sg != NULL) { + np = strdup(sg->sg_name); + sg = sgr_next (); + + if(gr_locate (np) == NULL) { + if (sgr_remove (np) == 0) { + /* + * This shouldn't happen (the entry exists) but... + */ + fprintf (stderr, + _("%s: cannot remove entry '%s' from %s\n"), + Prog, np, sgr_dbname ()); + free(np); + fail_exit (3); + } } + free(np); } /* Index: shadow-4.5/src/pwconv.c =================================================================== --- shadow-4.5.orig/src/pwconv.c +++ shadow-4.5/src/pwconv.c @@ -173,6 +173,7 @@ int main (int argc, char **argv) struct passwd pwent; const struct spwd *sp; struct spwd spent; + char *np; Prog = Basename (argv[0]); @@ -223,20 +224,25 @@ int main (int argc, char **argv) * Remove /etc/shadow entries for users not in /etc/passwd. */ (void) spw_rewind (); - while ((sp = spw_next ()) != NULL) { - if (pw_locate (sp->sp_namp) != NULL) { - continue; - } - - if (spw_remove (sp->sp_namp) == 0) { - /* - * This shouldn't happen (the entry exists) but... - */ - fprintf (stderr, - _("%s: cannot remove entry '%s' from %s\n"), - Prog, sp->sp_namp, spw_dbname ()); - fail_exit (E_FAILURE); + sp = spw_next (); + np = NULL; + while (sp != NULL) { + np = strdup(sp->sp_namp); + sp = spw_next (); + + if (pw_locate (np) == NULL) { + if (spw_remove (np) == 0) { + /* + * This shouldn't happen (the entry exists) but... + */ + fprintf (stderr, + _("%s: cannot remove entry '%s' from %s\n"), + Prog, np, spw_dbname ()); + free(np); + fail_exit (E_FAILURE); + } } + free(np); } /*