* lib/prototypes.h, configure.in, libmisc/Makefile.am,
libmisc/xgetXXbyYY.c, libmisc/xgetpwnam.c, libmisc/xgetpwuid.c, libmisc/xgetgrnam.c, libmisc/xgetgrgid.c, libmisc/xgetspnam.c: Added functions xgetpwnam(), xgetpwuid(), xgetgrnam(), xgetgrgid(), and xgetspnam(). They allocate memory for the returned structure and are more robust to successive calls. They are implemented with the libc's getxxyyy_r() functions if available. * libmisc/limits.c, libmisc/entry.c, libmisc/chowntty.c, libmisc/addgrps.c, libmisc/myname.c, libmisc/rlogin.c, libmisc/pwdcheck.c, src/newgrp.c, src/login_nopam.c, src/userdel.c, src/lastlog.c, src/grpck.c, src/gpasswd.c, src/newusers.c, src/chpasswd.c, src/chfn.c, src/groupmems.c, src/usermod.c, src/expiry.c, src/groupdel.c, src/chgpasswd.c, src/su.c, src/useradd.c, src/groupmod.c, src/passwd.c, src/pwck.c, src/groupadd.c, src/chage.c, src/login.c, src/suauth.c, src/faillog.c, src/groups.c, src/chsh.c, src/id.c: Review all the usage of one of the getpwnam(), getpwuid(), getgrnam(), getgrgid(), and getspnam() functions. It was noticed on http://bugs.debian.org/341230 that chfn and chsh use a passwd structure after calling a pam function, which result in using information from the passwd structure requested by pam, not the original one. It is much easier to use the new xget... functions to avoid these issues. I've checked which call to the original get... functions could be left (reducing the scope of the structure if possible), and I've left comments to ease future reviews (e.g. /* local, no need for xgetpwnam */). Note: the getpwent/getgrent calls should probably be checked also. * src/groupdel.c, src/expiry.c: Fix typos in comments. * src/groupmod.c: Re-indent. * libmisc/Makefile.am, lib/groupmem.c, lib/groupio.c, lib/pwmem.c, lib/pwio.c, lib/shadowmem.c, lib/shadowio.c: Move the __<xx>_dup functions (used by the xget... functions) from the <xx>io.c files to the new <xx>mem.c files. This avoid linking some utils against the SELinux library.
This commit is contained in:
@ -73,7 +73,7 @@ static gid_t group_newid;
|
||||
static char *Prog;
|
||||
|
||||
static int
|
||||
oflg = 0, /* permit non-unique group ID to be specified with -g */
|
||||
oflg = 0, /* permit non-unique group ID to be specified with -g */
|
||||
gflg = 0, /* new ID value for the group */
|
||||
nflg = 0; /* a new name has been specified for the group */
|
||||
|
||||
@ -257,7 +257,7 @@ static void check_new_gid (void)
|
||||
return;
|
||||
}
|
||||
|
||||
if (oflg || !getgrgid (group_newid))
|
||||
if (oflg || !getgrgid (group_newid)) /* local, no need for xgetgrgid */
|
||||
return;
|
||||
|
||||
/*
|
||||
@ -292,6 +292,7 @@ static void check_new_name (void)
|
||||
/*
|
||||
* If the entry is found, too bad.
|
||||
*/
|
||||
/* local, no need for xgetgrnam */
|
||||
if (getgrnam (group_newname)) {
|
||||
fprintf (stderr,
|
||||
_("%s: %s is not a unique name\n"), Prog,
|
||||
@ -457,11 +458,8 @@ static void open_files (void)
|
||||
*/
|
||||
int main (int argc, char **argv)
|
||||
{
|
||||
struct group *grp;
|
||||
|
||||
#ifdef USE_PAM
|
||||
pam_handle_t *pamh = NULL;
|
||||
struct passwd *pampw;
|
||||
int retval;
|
||||
#endif
|
||||
|
||||
@ -485,13 +483,17 @@ int main (int argc, char **argv)
|
||||
#ifdef USE_PAM
|
||||
retval = PAM_SUCCESS;
|
||||
|
||||
pampw = getpwuid (getuid ());
|
||||
if (pampw == NULL) {
|
||||
retval = PAM_USER_UNKNOWN;
|
||||
}
|
||||
{
|
||||
struct passwd *pampw;
|
||||
pampw = getpwuid (getuid ()); /* local, no need for xgetpwuid */
|
||||
if (pampw == NULL) {
|
||||
retval = PAM_USER_UNKNOWN;
|
||||
}
|
||||
|
||||
if (retval == PAM_SUCCESS) {
|
||||
retval = pam_start ("groupmod", pampw->pw_name, &conv, &pamh);
|
||||
if (retval == PAM_SUCCESS) {
|
||||
retval = pam_start ("groupmod", pampw->pw_name,
|
||||
&conv, &pamh);
|
||||
}
|
||||
}
|
||||
|
||||
if (retval == PAM_SUCCESS) {
|
||||
@ -517,19 +519,23 @@ int main (int argc, char **argv)
|
||||
#ifdef SHADOWGRP
|
||||
is_shadow_grp = sgr_file_present ();
|
||||
#endif
|
||||
/*
|
||||
* Start with a quick check to see if the group exists.
|
||||
*/
|
||||
if (!(grp = getgrnam (group_name))) {
|
||||
fprintf (stderr, _("%s: group %s does not exist\n"),
|
||||
Prog, group_name);
|
||||
{
|
||||
struct group *grp;
|
||||
/*
|
||||
* Start with a quick check to see if the group exists.
|
||||
*/
|
||||
/* local, no need for xgetgrnam */
|
||||
if (!(grp = getgrnam (group_name))) {
|
||||
fprintf (stderr, _("%s: group %s does not exist\n"),
|
||||
Prog, group_name);
|
||||
#ifdef WITH_AUDIT
|
||||
audit_logger (AUDIT_USER_CHAUTHTOK, Prog, "modifying group",
|
||||
group_name, -1, 0);
|
||||
audit_logger (AUDIT_USER_CHAUTHTOK, Prog,
|
||||
"modifying group", group_name, -1, 0);
|
||||
#endif
|
||||
exit (E_NOTFOUND);
|
||||
} else
|
||||
group_id = grp->gr_gid;
|
||||
exit (E_NOTFOUND);
|
||||
} else
|
||||
group_id = grp->gr_gid;
|
||||
}
|
||||
|
||||
#ifdef WITH_AUDIT
|
||||
/* Set new name/id to original if not specified on command line */
|
||||
|
Reference in New Issue
Block a user