From: Todd C. Miller Date: Sun, 13 Nov 2011 17:11:00 +0000 (-0500) Subject: Make sudo_goodpath() return value bolean X-Git-Tag: SUDO_1_8_4~155^2 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=f3ae31185b59f0459abcb209f90cd6f680e16882;p=sudo Make sudo_goodpath() return value bolean --- diff --git a/plugins/sudoers/find_path.c b/plugins/sudoers/find_path.c index a168234a2..0415b36e3 100644 --- a/plugins/sudoers/find_path.c +++ b/plugins/sudoers/find_path.c @@ -60,8 +60,8 @@ find_path(char *infile, char **outfile, struct stat *sbp, char *path, static char command[PATH_MAX]; /* qualified filename */ char *n; /* for traversing path */ char *origpath; /* so we can free path later */ - char *result = NULL; /* result of path/file lookup */ - int checkdot = 0; /* check current dir? */ + int found = FALSE; /* did we find the command? */ + int checkdot = FALSE; /* check current dir? */ int len; /* length parameter */ debug_decl(find_path, SUDO_DEBUG_UTIL) @@ -106,7 +106,7 @@ find_path(char *infile, char **outfile, struct stat *sbp, char *path, len = snprintf(command, sizeof(command), "%s/%s", path, infile); if (len <= 0 || len >= sizeof(command)) errorx(1, _("%s: %s"), infile, strerror(ENAMETOOLONG)); - if ((result = sudo_goodpath(command, sbp))) + if ((found = sudo_goodpath(command, sbp))) break; path = n + 1; @@ -117,17 +117,17 @@ find_path(char *infile, char **outfile, struct stat *sbp, char *path, /* * Check current dir if dot was in the PATH */ - if (!result && checkdot) { + if (!found && checkdot) { len = snprintf(command, sizeof(command), "./%s", infile); if (len <= 0 || len >= sizeof(command)) errorx(1, _("%s: %s"), infile, strerror(ENAMETOOLONG)); - result = sudo_goodpath(command, sbp); - if (result && ignore_dot) + found = sudo_goodpath(command, sbp); + if (found && ignore_dot) debug_return_int(NOT_FOUND_DOT); } - if (result) { - *outfile = result; + if (found) { + *outfile = command; debug_return_int(FOUND); } else debug_return_int(NOT_FOUND); diff --git a/plugins/sudoers/goodpath.c b/plugins/sudoers/goodpath.c index 08556102f..d0c6df9e2 100644 --- a/plugins/sudoers/goodpath.c +++ b/plugins/sudoers/goodpath.c @@ -41,27 +41,21 @@ /* * Verify that path is a normal file and executable by root. */ -char * +int sudo_goodpath(const char *path, struct stat *sbp) { struct stat sb; + int rval = FALSE; debug_decl(sudo_goodpath, SUDO_DEBUG_UTIL) - /* Check for brain damage */ - if (path == NULL || path[0] == '\0') - debug_return_str(NULL); - - if (stat(path, &sb)) - debug_return_str(NULL); - - /* Make sure path describes an executable regular file. */ - if (!S_ISREG(sb.st_mode) || !(sb.st_mode & 0000111)) { - errno = EACCES; - debug_return_str(NULL); - } - - if (sbp != NULL) + if (path != NULL && stat(path, &sb) == 0) { + /* Make sure path describes an executable regular file. */ + if (S_ISREG(sb.st_mode) && ISSET(sb.st_mode, 0111)) + rval = TRUE; + else + errno = EACCES; (void) memcpy(sbp, &sb, sizeof(struct stat)); + } - debug_return_str((char *)path); + debug_return_int(rval); } diff --git a/plugins/sudoers/sudoers.h b/plugins/sudoers/sudoers.h index fe9887a7c..0fed51148 100644 --- a/plugins/sudoers/sudoers.h +++ b/plugins/sudoers/sudoers.h @@ -207,7 +207,7 @@ struct timeval; #define YY_DECL int yylex(void) /* goodpath.c */ -char *sudo_goodpath(const char *, struct stat *); +int sudo_goodpath(const char *, struct stat *); /* findpath.c */ int find_path(char *, char **, struct stat *, char *, int);