diff --git a/ChangeLog b/ChangeLog index 6151e4fd..34231bcc 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2008-08-26 Nicolas François + + * src/groupmems.c: When removing an user, check if deluser is on + the list, not adduser. This fixes a segmentation fault for every + call of groupmems -d. + * libmisc/list.c: Add assertions to help identifying these issues. + * libmisc/list.c: Avoid implicit conversion of pointers to + booleans. + 2008-08-26 Nicolas François * NEWS, src/groupmems.c: Use the "groupmems" PAM service name diff --git a/NEWS b/NEWS index c60f0d25..19500726 100644 --- a/NEWS +++ b/NEWS @@ -18,6 +18,7 @@ shadow-4.1.2.1 -> shadow-4.1.3 UNRELEASED group. * Added syslog support. * Use the groupmems PAM service name instead of groupmod. + * Fix segmentation faults when adding or removing users from a group. - newusers * Implement the -r, --system option. - passwd diff --git a/libmisc/list.c b/libmisc/list.c index 36b3caf2..1d0525da 100644 --- a/libmisc/list.c +++ b/libmisc/list.c @@ -50,6 +50,8 @@ char **add_list (char **list, const char *member) int i; char **tmp; + assert (NULL != member); + /* * Scan the list for the new name. Return the original list * pointer if it is present. @@ -97,6 +99,8 @@ char **del_list (char **list, const char *member) int i, j; char **tmp; + assert (NULL != member); + /* * Scan the list for the old name. Return the original list * pointer if it is not present. @@ -142,12 +146,12 @@ char **dup_list (char *const *list) int i; char **tmp; - for (i = 0; list[i]; i++); + for (i = 0; NULL != list[i]; i++); tmp = (char **) xmalloc ((i + 1) * sizeof (char *)); i = 0; - while (*list) { + while (NULL != *list) { tmp[i] = xstrdup (*list); i++; list++; @@ -159,12 +163,15 @@ char **dup_list (char *const *list) bool is_on_list (char *const *list, const char *member) { - while (*list) { + assert (NULL != member); + + while (NULL != *list) { if (strcmp (*list, member) == 0) { return true; } list++; } + return false; } @@ -179,6 +186,8 @@ char **comma_to_list (const char *comma) int i; char *cp, *cp2; + assert (NULL != comma); + /* * Make a copy since we are going to be modifying the list */ diff --git a/src/groupmems.c b/src/groupmems.c index c1f083de..b659fe19 100644 --- a/src/groupmems.c +++ b/src/groupmems.c @@ -291,7 +291,7 @@ int main (int argc, char **argv) fail_exit (13); } } else if (NULL != deluser) { - if (!is_on_list (grp->gr_mem, adduser)) { + if (!is_on_list (grp->gr_mem, deluser)) { fprintf (stderr, _("%s: user '%s' is not a member of '%s'\n"), Prog, deluser, grp->gr_name);