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 */
if (strlen(infile) >= PATH_MAX)
len = snprintf(command, sizeof(command), "%s/%s", path, infile);
if (len <= 0 || len >= sizeof(command))
errorx(1, "%s: File name too long", infile);
- if ((result = sudo_goodpath(command, sbp)))
+ if ((found = sudo_goodpath(command, sbp)))
break;
path = n + 1;
/*
* 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: File name too long", infile);
- result = sudo_goodpath(command, sbp);
- if (result && ignore_dot)
+ found = sudo_goodpath(command, sbp);
+ if (found && ignore_dot)
return NOT_FOUND_DOT;
}
- if (result) {
- *outfile = result;
+ if (found) {
+ *outfile = command;
return FOUND;
} else
return NOT_FOUND;
/*
* Verify that path is a normal file and executable by root.
*/
-char *
+int
sudo_goodpath(path, sbp)
const char *path;
struct stat *sbp;
{
struct stat sb;
-
- /* Check for brain damage */
- if (path == NULL || path[0] == '\0')
- return NULL;
-
- if (stat(path, &sb))
- return NULL;
-
- /* Make sure path describes an executable regular file. */
- if (!S_ISREG(sb.st_mode) || !(sb.st_mode & 0000111)) {
- errno = EACCES;
- return NULL;
+ int rval = FALSE;
+
+ 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;
+ if (sbp)
+ (void) memcpy(sbp, &sb, sizeof(struct stat));
}
- if (sbp != NULL)
- (void) memcpy(sbp, &sb, sizeof(struct stat));
- return (char *)path;
+ return rval;
}