From: Todd C. Miller Date: Sun, 9 Jan 2005 23:58:21 +0000 (+0000) Subject: Use function pointers to only call private passwd/group routines when X-Git-Tag: SUDO_1_7_0~740 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=7ca844890d30b834ae1e14fff6de94bb25a0f8b0;p=sudo Use function pointers to only call private passwd/group routines when using a nonstandard passwd/group file. --- diff --git a/pwutil.c b/pwutil.c index 9f62b8f1c..ed9959525 100644 --- a/pwutil.c +++ b/pwutil.c @@ -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) diff --git a/testsudoers.c b/testsudoers.c index 49b6f97b8..d51d592dd 100644 --- a/testsudoers.c +++ b/testsudoers.c @@ -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(); diff --git a/tsgetgrpw.c b/tsgetgrpw.c index a4f8428fb..693ef35e6 100644 --- a/tsgetgrpw.c +++ b/tsgetgrpw.c @@ -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; }