From a62e7812484a80f5f502dbde3bd276bc042bea29 Mon Sep 17 00:00:00 2001 From: nekral-guest Date: Sun, 22 Feb 2009 23:23:15 +0000 Subject: [PATCH] * libmisc/find_new_gid.c, libmisc/find_new_uid.c: Avoid calling getgrent()/getpwent() after they return NULL. This caused LDAP to return at the beginning of the group/user entries. --- ChangeLog | 6 ++++++ libmisc/find_new_gid.c | 14 +++++++++++--- libmisc/find_new_uid.c | 14 +++++++++++--- 3 files changed, 28 insertions(+), 6 deletions(-) diff --git a/ChangeLog b/ChangeLog index 93a5d88a..10414bfb 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2009-02-22 Nicolas François + + * libmisc/find_new_gid.c, libmisc/find_new_uid.c: Avoid calling + getgrent()/getpwent() after they return NULL. This caused LDAP to + return at the beginning of the group/user entries. + 2009-01-27 Nicolas François * man/nologin.8.xml: Fix typo (HYSTORY -> HISTORY). diff --git a/libmisc/find_new_gid.c b/libmisc/find_new_gid.c index 0201ebdf..1f2de5fd 100644 --- a/libmisc/find_new_gid.c +++ b/libmisc/find_new_gid.c @@ -89,9 +89,7 @@ int find_new_gid (bool sys_group, gid_t *gid, gid_t const *preferred_gid) * some groups were created but the changes were not committed yet. */ setgrent (); - gr_rewind (); - while ( ((grp = getgrent ()) != NULL) - || ((grp = gr_next ()) != NULL)) { + while ((grp = getgrent ()) != NULL) { if ((grp->gr_gid >= group_id) && (grp->gr_gid <= gid_max)) { group_id = grp->gr_gid + 1; } @@ -101,6 +99,16 @@ int find_new_gid (bool sys_group, gid_t *gid, gid_t const *preferred_gid) } } endgrent (); + gr_rewind (); + while ((grp = getgrent ()) != NULL) { + if ((grp->gr_gid >= group_id) && (grp->gr_gid <= gid_max)) { + group_id = grp->gr_gid + 1; + } + /* create index of used GIDs */ + if (grp->gr_gid <= gid_max) { + used_gids[grp->gr_gid] = 1; + } + } /* * If a group with GID equal to GID_MAX exists, the above algorithm diff --git a/libmisc/find_new_uid.c b/libmisc/find_new_uid.c index 90918b40..f00b3e12 100644 --- a/libmisc/find_new_uid.c +++ b/libmisc/find_new_uid.c @@ -90,9 +90,7 @@ int find_new_uid (bool sys_user, uid_t *uid, uid_t const *preferred_uid) * some users were created but the changes were not committed yet. */ setpwent (); - pw_rewind (); - while ( ((pwd = getpwent ()) != NULL) - || ((pwd = pw_next ()) != NULL)) { + while ((pwd = getpwent ()) != NULL) { if ((pwd->pw_uid >= user_id) && (pwd->pw_uid <= uid_max)) { user_id = pwd->pw_uid + 1; } @@ -102,6 +100,16 @@ int find_new_uid (bool sys_user, uid_t *uid, uid_t const *preferred_uid) } } endpwent (); + pw_rewind (); + while ((pwd = pw_next ()) != NULL) { + if ((pwd->pw_uid >= user_id) && (pwd->pw_uid <= uid_max)) { + user_id = pwd->pw_uid + 1; + } + /* create index of used UIDs */ + if (pwd->pw_uid <= uid_max) { + used_uids[pwd->pw_uid] = 1; + } + } /* * If a user with UID equal to UID_MAX exists, the above algorithm