Use function pointers to only call private passwd/group routines when

using a nonstandard passwd/group file.
This commit is contained in:
Todd C. Miller
2005-01-09 23:58:21 +00:00
parent e7f2e2a190
commit 7ca844890d
3 changed files with 75 additions and 47 deletions

View File

@@ -56,21 +56,19 @@ static const char rcsid[] = "$Sudo$";
#endif /* lint */
#ifdef MYPW
void my_setgrfile __P((const char *));
void my_setgrent __P((void));
void my_endgrent __P((void));
struct group *my_getgrnam __P((const char *));
struct group *my_getgruid __P((gid_t));
extern void (*my_setgrent) __P((void));
extern void (*my_endgrent) __P((void));
extern struct group *(*my_getgrnam) __P((const char *));
extern struct group *(*my_getgrgid) __P((gid_t));
#define setgrent() my_setgrent()
#define endgrent() my_endgrent()
#define getgrnam(n) my_getgrnam(n)
#define getgruid(g) my_getgruid(g)
#define getgrgid(g) my_getgrgid(g)
void my_setpwfile __P((const char *));
void my_setpwent __P((void));
void my_endpwent __P((void));
struct passwd *my_getpwnam __P((const char *));
struct passwd *my_getpwuid __P((uid_t));
extern void (*my_setpwent) __P((void));
extern void (*my_endpwent) __P((void));
extern struct passwd *(*my_getpwnam) __P((const char *));
extern struct passwd *(*my_getpwuid) __P((uid_t));
#define setpwent() my_setpwent()
#define endpwent() my_endpwent()
#define getpwnam(n) my_getpwnam(n)

View File

@@ -85,6 +85,16 @@ struct sudo_user sudo_user;
struct passwd *list_pw;
extern int parse_error;
/* passwd/group redirection for pwutil.c */
void (*my_setgrent) __P((void)) = setgrent;
void (*my_endgrent) __P((void)) = endgrent;
struct group *(*my_getgrnam) __P((const char *)) = getgrnam;
struct group *(*my_getgrgid) __P((gid_t)) = getgrgid;
void (*my_setpwent) __P((void)) = setpwent;
void (*my_endpwent) __P((void)) = endpwent;
struct passwd *(*my_getpwnam) __P((const char *)) = getpwnam;
struct passwd *(*my_getpwuid) __P((uid_t)) = getpwuid;
/* For getopt(3) */
extern char *optarg;
extern int optind;
@@ -99,8 +109,18 @@ void print_privilege __P((struct privilege *));
void print_userspecs __P((void));
void usage __P((void)) __attribute__((__noreturn__));
extern void my_setpwfile __P((const char *));
extern void my_setgrfile __P((const char *));
extern void ts_setgrfile __P((const char *));
extern void ts_setgrent __P((void));
extern void ts_endgrent __P((void));
extern struct group *ts_getgrent __P((void));
extern struct group *ts_getgrnam __P((const char *));
extern struct group *ts_getgrgid __P((gid_t));
extern void ts_setpwfile __P((const char *));
extern void ts_setpwent __P((void));
extern void ts_endpwent __P((void));
extern struct passwd *ts_getpwent __P((void));
extern struct passwd *ts_getpwnam __P((const char *));
extern struct passwd *ts_getpwuid __P((uid_t));
int
main(argc, argv)
@@ -152,10 +172,20 @@ main(argc, argv)
NewArgv = argv;
/* Set group/passwd file and init the cache. */
if (grfile)
my_setgrfile(grfile);
if (pwfile)
my_setpwfile(pwfile);
if (grfile) {
my_setgrent = ts_setgrent;
my_endgrent = ts_endgrent;
my_getgrnam = ts_getgrnam;
my_getgrgid = ts_getgrgid;
ts_setgrfile(grfile);
}
if (pwfile) {
my_setpwent = ts_setpwent;
my_endpwent = ts_endpwent;
my_getpwnam = ts_getpwnam;
my_getpwuid = ts_getpwuid;
ts_setpwfile(pwfile);
}
sudo_setpwent();
sudo_setgrent();

View File

@@ -67,31 +67,31 @@ static int gr_stayopen;
static struct group grbuf;
static char *gr_mem[GRMEM_MAX+1];
void my_setgrfile __P((const char *));
void my_setgrent __P((void));
void my_endgrent __P((void));
struct group *my_getgrent __P((void));
struct group *my_getgrnam __P((const char *));
struct group *my_getgruid __P((gid_t));
void ts_setgrfile __P((const char *));
void ts_setgrent __P((void));
void ts_endgrent __P((void));
struct group *ts_getgrent __P((void));
struct group *ts_getgrnam __P((const char *));
struct group *ts_getgrgid __P((gid_t));
void my_setpwfile __P((const char *));
void my_setpwent __P((void));
void my_endpwent __P((void));
struct passwd *my_getpwent __P((void));
struct passwd *my_getpwnam __P((const char *));
struct passwd *my_getpwuid __P((uid_t));
void ts_setpwfile __P((const char *));
void ts_setpwent __P((void));
void ts_endpwent __P((void));
struct passwd *ts_getpwent __P((void));
struct passwd *ts_getpwnam __P((const char *));
struct passwd *ts_getpwuid __P((uid_t));
void
my_setpwfile(file)
ts_setpwfile(file)
const char *file;
{
pwfile = file;
if (pwf != NULL)
my_endpwent();
ts_endpwent();
}
void
my_setpwent()
ts_setpwent()
{
if (pwf == NULL)
pwf = fopen(pwfile, "r");
@@ -101,7 +101,7 @@ my_setpwent()
}
void
my_endpwent()
ts_endpwent()
{
if (pwf != NULL) {
fclose(pwf);
@@ -111,7 +111,7 @@ my_endpwent()
}
struct passwd *
my_getpwent()
ts_getpwent()
{
size_t len;
char buf[LINE_MAX], *cp, *colon;
@@ -152,7 +152,7 @@ my_getpwent()
}
struct passwd *
my_getpwnam(name)
ts_getpwnam(name)
const char *name;
{
struct passwd *pw;
@@ -161,7 +161,7 @@ my_getpwnam(name)
rewind(pwf);
else if ((pwf = fopen(pwfile, "r")) == NULL)
return(NULL);
while ((pw = my_getpwent()) != NULL) {
while ((pw = ts_getpwent()) != NULL) {
if (strcmp(pw->pw_name, name) == 0)
break;
}
@@ -173,7 +173,7 @@ my_getpwnam(name)
}
struct passwd *
my_getpwuid(uid)
ts_getpwuid(uid)
uid_t uid;
{
struct passwd *pw;
@@ -182,7 +182,7 @@ my_getpwuid(uid)
rewind(pwf);
else if ((pwf = fopen(pwfile, "r")) == NULL)
return(NULL);
while ((pw = my_getpwent()) != NULL) {
while ((pw = ts_getpwent()) != NULL) {
if (pw->pw_uid == uid)
break;
}
@@ -194,16 +194,16 @@ my_getpwuid(uid)
}
void
my_setgrfile(file)
ts_setgrfile(file)
const char *file;
{
grfile = file;
if (grf != NULL)
my_endgrent();
ts_endgrent();
}
void
my_setgrent()
ts_setgrent()
{
if (grf == NULL)
grf = fopen(grfile, "r");
@@ -213,7 +213,7 @@ my_setgrent()
}
void
my_endgrent()
ts_endgrent()
{
if (grf != NULL) {
fclose(grf);
@@ -223,7 +223,7 @@ my_endgrent()
}
struct group *
my_getgrent()
ts_getgrent()
{
size_t len;
char buf[LINE_MAX], *cp, *colon;
@@ -262,7 +262,7 @@ my_getgrent()
}
struct group *
my_getgrnam(name)
ts_getgrnam(name)
const char *name;
{
struct group *gr;
@@ -271,7 +271,7 @@ my_getgrnam(name)
rewind(grf);
else if ((grf = fopen(grfile, "r")) == NULL)
return(NULL);
while ((gr = my_getgrent()) != NULL) {
while ((gr = ts_getgrent()) != NULL) {
if (strcmp(gr->gr_name, name) == 0)
break;
}
@@ -283,7 +283,7 @@ my_getgrnam(name)
}
struct group *
my_getgrgid(gid)
ts_getgrgid(gid)
gid_t gid;
{
struct group *gr;
@@ -292,7 +292,7 @@ my_getgrgid(gid)
rewind(grf);
else if ((grf = fopen(grfile, "r")) == NULL)
return(NULL);
while ((gr = my_getgrent()) != NULL) {
while ((gr = ts_getgrent()) != NULL) {
if (gr->gr_gid == gid)
break;
}