+2008-04-16 Nicolas François <nicolas.francois@centraliens.net>
+
+ 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 <nicolas.francois@centraliens.net>
* NEWS, configure.in: Fix the detection of the audit, pam, and
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);
}
user_id = pwd->pw_uid + 1;
}
}
+ endpwent ();
/*
* If a user with UID equal to UID_MAX exists, the above algorithm
group_id = grp->gr_gid + 1;
}
}
+ endgrent ();
/*
* If a group with GID equal to GID_MAX exists, the above algorithm
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);
while ( (pwent = getpwent ()) != NULL ) {
reset_one (pwent->pw_uid);
}
+ endpwent ();
}
}
setmax_one (user, max);
} else {
setpwent ();
- while ((pwent = getpwent ()))
+ while ( (pwent = getpwent ()) != NULL ) {
setmax_one (pwent->pw_uid, max);
+ }
+ endpwent ();
}
}
set_locktime_one (user, locktime);
} else {
setpwent ();
- while ((pwent = getpwent ()))
+ while ( (pwent = getpwent ()) != NULL ) {
set_locktime_one (pwent->pw_uid, locktime);
+ }
+ endpwent ();
}
}
}
}
}
+ endpwent ();
}
/*
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++)
flag = 1;
}
}
+ endgrent ();
/* local, no need for xgetgrgid */
if (!flag && (grp = getgrgid (pwd->pw_gid))) {
if (groups++)
uid_t user;
setpwent ();
- while ((pwent = getpwent ())) {
+ while ( (pwent = getpwent ()) != NULL ) {
user = pwent->pw_uid;
if (uflg &&
((umin != -1 && user < (uid_t)umin) ||
print_one (pwent);
}
+ endpwent ();
}
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",
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 */
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);
exit (E_NOPERM);
}
setpwent ();
- while ((pw = getpwent ()))
+ while ( (pw = getpwent ()) != NULL ) {
print_status (pw);
+ }
+ endpwent ();
exit (E_SUCCESS);
}
#if 0