]> granicus.if.org Git - sudo/commitdiff
in check_sudoers, cache the sudoers file handle in sudoers_fp so
authorTodd C. Miller <Todd.Miller@courtesan.com>
Wed, 21 Jan 1998 05:03:46 +0000 (05:03 +0000)
committerTodd C. Miller <Todd.Miller@courtesan.com>
Wed, 21 Jan 1998 05:03:46 +0000 (05:03 +0000)
we don't have to open it again in the parse.  This may help
with weird solaris problems where EAGAIN sometime occurrs.

sudo.c

diff --git a/sudo.c b/sudo.c
index fa9687c82533ee6c9024a4e302b09daf164b4486..3445bd56cfd6bb522448ca3bccc236b8e11c5f79 100644 (file)
--- a/sudo.c
+++ b/sudo.c
@@ -149,6 +149,7 @@ char *prompt;
 char host[MAXHOSTNAMELEN + 1];
 char *shost;
 char cwd[MAXPATHLEN + 1];
+FILE *sudoers_fp = NULL;
 struct stat cmnd_st;
 static char *runas_homedir = NULL;
 extern struct interface *interfaces;
@@ -783,7 +784,7 @@ static void load_cmnd(sudo_mode)
 static int check_sudoers()
 {
     struct stat statbuf;
-    int fd = -1, rootstat;
+    int rootstat, i;
     char c;
     int rtn = ALL_SYSTEMS_GO;
 
@@ -832,12 +833,25 @@ static int check_sudoers()
        rtn = SUDOERS_WRONG_MODE;
     else if (statbuf.st_uid != SUDOERS_UID || statbuf.st_gid != SUDOERS_GID)
        rtn = SUDOERS_WRONG_OWNER;
-    else if ((fd = open(_PATH_SUDO_SUDOERS, O_RDONLY)) == -1 ||
-            read(fd, &c, 1) == -1)
-       rtn = NO_SUDOERS_FILE;
-
-    if (fd != -1)
-       (void) close(fd);
+    else {
+       /* Solaris sometimes returns EAGAIN so try 10 times */
+       for (i = 0; i < 10 ; i++) {
+           errno = 0;
+           if ((sudoers_fp = fopen(_PATH_SUDO_SUDOERS, "r")) == NULL ||
+               fread(&c, sizeof(c), 1, sudoers_fp) != 1) {
+               sudoers_fp = NULL;
+               if (errno != EAGAIN && errno != EWOULDBLOCK)
+                   break;
+           } else
+               break;
+           sleep(1);
+       }
+       if (sudoers_fp == NULL) {
+           fprintf(stderr, "%s: cannot open %s: ", Argv[0], _PATH_SUDO_SUDOERS);
+           perror("");
+           rtn = NO_SUDOERS_FILE;
+       }
+    }
 
     set_perms(PERM_ROOT, 0);
     set_perms(PERM_USER, 0);