From: nekral-guest Date: Wed, 16 Apr 2008 21:52:46 +0000 (+0000) Subject: Ensure that getpwent() is used in setpwent(), getpwent(), X-Git-Tag: 4.1.2~33 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7baffa5e74b9eea72635e644461069dcd478a259;p=thirdparty%2Fshadow.git Ensure that getpwent() is used in setpwent(), getpwent(), endpwend() sequences (ditto for getgrent(), getspent(), and getsgent()). The only real (minor) issue was in login, which kept the passwd file open. * libmisc/entry.c: Remove unneeded setspent() and endspent() (only getspnam is called in the middle). * libmisc/find_new_ids.c: Make sure to close the password and group files with endpwent() and endgrent(). * libmisc/pwdcheck.c: Remove unneeded endspent() (only getspnam() is called before). * src/lastlog.c, src/passwd.c, src/groupmod.c, src/faillog.c, src/groups.c: Make sure to close the password file with endpwent(). * src/login.c: Remove unneeded setpwent() (only xgetpwnam is called before). * src/login.c, src/newgrp.c: Fix typos in comments. --- diff --git a/ChangeLog b/ChangeLog index dc3630a9a..ac6fef85d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,22 @@ +2008-04-16 Nicolas François + + Ensure that getpwent() is used in setpwent(), getpwent(), + endpwend() sequences (ditto for getgrent(), getspent(), and + getsgent()). The only real (minor) issue was in login, which kept + the passwd file open. + * libmisc/entry.c: Remove unneeded setspent() and endspent() (only + getspnam is called in the middle). + * libmisc/find_new_ids.c: Make sure to close the password and + group files with endpwent() and endgrent(). + * libmisc/pwdcheck.c: Remove unneeded endspent() (only getspnam() + is called before). + * src/lastlog.c, src/passwd.c, src/groupmod.c, src/faillog.c, + src/groups.c: Make sure to close + the password file with endpwent(). + * src/login.c: Remove unneeded setpwent() (only xgetpwnam is + called before). + * src/login.c, src/newgrp.c: Fix typos in comments. + 2008-04-16 Nicolas François * NEWS, configure.in: Fix the detection of the audit, pam, and diff --git a/libmisc/entry.c b/libmisc/entry.c index 5b95eba1b..3316c8d50 100644 --- a/libmisc/entry.c +++ b/libmisc/entry.c @@ -54,14 +54,11 @@ void pw_entry (const char *name, struct passwd *pwent) pwent->pw_dir = xstrdup (passwd->pw_dir); pwent->pw_shell = xstrdup (passwd->pw_shell); #if !defined(AUTOSHADOW) - setspent (); /* local, no need for xgetspnam */ if ((spwd = getspnam (name))) { pwent->pw_passwd = xstrdup (spwd->sp_pwdp); - endspent (); return; } - endspent (); #endif pwent->pw_passwd = xstrdup (passwd->pw_passwd); } diff --git a/libmisc/find_new_ids.c b/libmisc/find_new_ids.c index 66dc6e80c..90e4ceef3 100644 --- a/libmisc/find_new_ids.c +++ b/libmisc/find_new_ids.c @@ -65,6 +65,7 @@ int find_new_uid (int sys_user, uid_t *uid, uid_t const *preferred_uid) user_id = pwd->pw_uid + 1; } } + endpwent (); /* * If a user with UID equal to UID_MAX exists, the above algorithm @@ -146,6 +147,7 @@ int find_new_gid (int sys_group, gid_t *gid, gid_t const *preferred_gid) group_id = grp->gr_gid + 1; } } + endgrent (); /* * If a group with GID equal to GID_MAX exists, the above algorithm diff --git a/libmisc/pwdcheck.c b/libmisc/pwdcheck.c index 1750ebf38..ce0a4f2c6 100644 --- a/libmisc/pwdcheck.c +++ b/libmisc/pwdcheck.c @@ -46,7 +46,6 @@ void passwd_check (const char *user, const char *passwd, const char *progname) if ((sp = getspnam (user))) /* !USE_PAM, no need for xgetspnam */ passwd = sp->sp_pwdp; - endspent (); if (pw_auth (passwd, user, PW_LOGIN, (char *) 0) != 0) { SYSLOG ((LOG_WARN, WRONGPWD2, user)); sleep (1); diff --git a/src/faillog.c b/src/faillog.c index 024e044db..36c38ff05 100644 --- a/src/faillog.c +++ b/src/faillog.c @@ -170,6 +170,7 @@ static void reset (void) while ( (pwent = getpwent ()) != NULL ) { reset_one (pwent->pw_uid); } + endpwent (); } } @@ -246,8 +247,10 @@ static void setmax (int max) setmax_one (user, max); } else { setpwent (); - while ((pwent = getpwent ())) + while ( (pwent = getpwent ()) != NULL ) { setmax_one (pwent->pw_uid, max); + } + endpwent (); } } @@ -288,8 +291,10 @@ static void set_locktime (long locktime) set_locktime_one (user, locktime); } else { setpwent (); - while ((pwent = getpwent ())) + while ( (pwent = getpwent ()) != NULL ) { set_locktime_one (pwent->pw_uid, locktime); + } + endpwent (); } } diff --git a/src/groupmod.c b/src/groupmod.c index 274c3adb7..1a3f55b31 100644 --- a/src/groupmod.c +++ b/src/groupmod.c @@ -547,6 +547,7 @@ void update_primary_groups (gid_t ogid, gid_t ngid) } } } + endpwent (); } /* diff --git a/src/groups.c b/src/groups.c index 53fdfb7db..9f89a7057 100644 --- a/src/groups.c +++ b/src/groups.c @@ -57,13 +57,12 @@ static void print_groups (const char *member) struct passwd *pwd; int flag = 0; - setgrent (); - /* local, no need for xgetpwnam */ if ((pwd = getpwnam (member)) == 0) { fprintf (stderr, _("%s: unknown user %s\n"), Prog, member); exit (1); } + setgrent (); while ((grp = getgrent ())) { if (is_on_list (grp->gr_mem, member)) { if (groups++) @@ -74,6 +73,7 @@ static void print_groups (const char *member) flag = 1; } } + endgrent (); /* local, no need for xgetgrgid */ if (!flag && (grp = getgrgid (pwd->pw_gid))) { if (groups++) diff --git a/src/lastlog.c b/src/lastlog.c index 445a1cc73..7b70bae6c 100644 --- a/src/lastlog.c +++ b/src/lastlog.c @@ -128,7 +128,7 @@ static void print (void) uid_t user; setpwent (); - while ((pwent = getpwent ())) { + while ( (pwent = getpwent ()) != NULL ) { user = pwent->pw_uid; if (uflg && ((umin != -1 && user < (uid_t)umin) || @@ -149,6 +149,7 @@ static void print (void) print_one (pwent); } + endpwent (); } int main (int argc, char **argv) diff --git a/src/login.c b/src/login.c index aa9e55603..79f3eedd6 100644 --- a/src/login.c +++ b/src/login.c @@ -738,7 +738,6 @@ int main (int argc, char **argv) */ retcode = pam_get_item (pamh, PAM_USER, (const void **)ptr_pam_user); - setpwent (); pwd = xgetpwnam (pam_user); if (!pwd) { SYSLOG ((LOG_ERR, "xgetpwnam(%s) failed", @@ -962,7 +961,7 @@ int main (int argc, char **argv) if (pwent.pw_shell[0] == '*') { /* subsystem root */ pwent.pw_shell++; /* skip the '*' */ subsystem (&pwent); /* figure out what to execute */ - subroot++; /* say i was here again */ + subroot++; /* say I was here again */ endpwent (); /* close all of the file which were */ endgrent (); /* open in the original rooted file */ endspent (); /* system. they will be re-opened */ diff --git a/src/newgrp.c b/src/newgrp.c index bf94d8bde..3f07a4ed1 100644 --- a/src/newgrp.c +++ b/src/newgrp.c @@ -695,7 +695,7 @@ int main (int argc, char **argv) prog = "/bin/sh"; /* - * Now i try to find the basename of the login shell. This will + * Now I try to find the basename of the login shell. This will * become argv[0] of the spawned command. */ cp = Basename ((char *) prog); diff --git a/src/passwd.c b/src/passwd.c index e85b2fe2f..42df517b3 100644 --- a/src/passwd.c +++ b/src/passwd.c @@ -848,8 +848,10 @@ int main (int argc, char **argv) exit (E_NOPERM); } setpwent (); - while ((pw = getpwent ())) + while ( (pw = getpwent ()) != NULL ) { print_status (pw); + } + endpwent (); exit (E_SUCCESS); } #if 0