]> granicus.if.org Git - sudo/commitdiff
Use function pointers to only call private passwd/group routines when
authorTodd C. Miller <Todd.Miller@courtesan.com>
Sun, 9 Jan 2005 23:58:21 +0000 (23:58 +0000)
committerTodd C. Miller <Todd.Miller@courtesan.com>
Sun, 9 Jan 2005 23:58:21 +0000 (23:58 +0000)
using a nonstandard passwd/group file.

pwutil.c
testsudoers.c
tsgetgrpw.c

index 9f62b8f1c51bf8addce7352edc764b896fe072b5..ed99595257d77e1cb03a9f0040d5c87f2c99fea5 100644 (file)
--- 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)
index 49b6f97b87da30514db833937dbd9ce1fca8ab45..d51d592ddebd81e97ff38e88ea10a4d418edc172 100644 (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();
 
index a4f8428fb6d2d26aca7cab3abd8323e8903aa541..693ef35e63bd028540202188321fad0de82c9555 100644 (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;
     }