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 */ #endif /* lint */
#ifdef MYPW #ifdef MYPW
void my_setgrfile __P((const char *)); extern void (*my_setgrent) __P((void));
void my_setgrent __P((void)); extern void (*my_endgrent) __P((void));
void my_endgrent __P((void)); extern struct group *(*my_getgrnam) __P((const char *));
struct group *my_getgrnam __P((const char *)); extern struct group *(*my_getgrgid) __P((gid_t));
struct group *my_getgruid __P((gid_t));
#define setgrent() my_setgrent() #define setgrent() my_setgrent()
#define endgrent() my_endgrent() #define endgrent() my_endgrent()
#define getgrnam(n) my_getgrnam(n) #define getgrnam(n) my_getgrnam(n)
#define getgruid(g) my_getgruid(g) #define getgrgid(g) my_getgrgid(g)
void my_setpwfile __P((const char *)); extern void (*my_setpwent) __P((void));
void my_setpwent __P((void)); extern void (*my_endpwent) __P((void));
void my_endpwent __P((void)); extern struct passwd *(*my_getpwnam) __P((const char *));
struct passwd *my_getpwnam __P((const char *)); extern struct passwd *(*my_getpwuid) __P((uid_t));
struct passwd *my_getpwuid __P((uid_t));
#define setpwent() my_setpwent() #define setpwent() my_setpwent()
#define endpwent() my_endpwent() #define endpwent() my_endpwent()
#define getpwnam(n) my_getpwnam(n) #define getpwnam(n) my_getpwnam(n)

View File

@@ -85,6 +85,16 @@ struct sudo_user sudo_user;
struct passwd *list_pw; struct passwd *list_pw;
extern int parse_error; 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) */ /* For getopt(3) */
extern char *optarg; extern char *optarg;
extern int optind; extern int optind;
@@ -99,8 +109,18 @@ void print_privilege __P((struct privilege *));
void print_userspecs __P((void)); void print_userspecs __P((void));
void usage __P((void)) __attribute__((__noreturn__)); void usage __P((void)) __attribute__((__noreturn__));
extern void my_setpwfile __P((const char *)); extern void ts_setgrfile __P((const char *));
extern void my_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 int
main(argc, argv) main(argc, argv)
@@ -152,10 +172,20 @@ main(argc, argv)
NewArgv = argv; NewArgv = argv;
/* Set group/passwd file and init the cache. */ /* Set group/passwd file and init the cache. */
if (grfile) if (grfile) {
my_setgrfile(grfile); my_setgrent = ts_setgrent;
if (pwfile) my_endgrent = ts_endgrent;
my_setpwfile(pwfile); 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_setpwent();
sudo_setgrent(); sudo_setgrent();

View File

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