From 8de870a70648f19a297f9fae206b80100be92d7f Mon Sep 17 00:00:00 2001 From: "Todd C. Miller" Date: Wed, 21 Jan 1998 05:03:46 +0000 Subject: [PATCH] in check_sudoers, cache the sudoers file handle in sudoers_fp so we don't have to open it again in the parse. This may help with weird solaris problems where EAGAIN sometime occurrs. --- sudo.c | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/sudo.c b/sudo.c index fa9687c82..3445bd56c 100644 --- 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); -- 2.40.0