In find_path(), return NOT_FOUND_ERROR instead of calling fatal()

if the path is too long.  Remove an extraneous check against PATH_MAX
in set_cmnd() since find_path() already contains such a check.
This commit is contained in:
Todd C. Miller
2014-03-26 14:15:15 -06:00
parent 4848b5691d
commit 639ac92e6d
3 changed files with 13 additions and 11 deletions

View File

@@ -66,7 +66,7 @@ find_path(char *infile, char **outfile, struct stat *sbp, char *path,
if (strlen(infile) >= PATH_MAX) { if (strlen(infile) >= PATH_MAX) {
errno = ENAMETOOLONG; errno = ENAMETOOLONG;
fatal("%s", infile); debug_return_int(NOT_FOUND_ERROR);
} }
/* /*
@@ -106,8 +106,9 @@ find_path(char *infile, char **outfile, struct stat *sbp, char *path,
*/ */
len = snprintf(command, sizeof(command), "%s/%s", path, infile); len = snprintf(command, sizeof(command), "%s/%s", path, infile);
if (len <= 0 || (size_t)len >= sizeof(command)) { if (len <= 0 || (size_t)len >= sizeof(command)) {
efree(origpath);
errno = ENAMETOOLONG; errno = ENAMETOOLONG;
fatal("%s", infile); debug_return_int(NOT_FOUND_ERROR);
} }
if ((found = sudo_goodpath(command, sbp))) if ((found = sudo_goodpath(command, sbp)))
break; break;
@@ -124,7 +125,7 @@ find_path(char *infile, char **outfile, struct stat *sbp, char *path,
len = snprintf(command, sizeof(command), "./%s", infile); len = snprintf(command, sizeof(command), "./%s", infile);
if (len <= 0 || (size_t)len >= sizeof(command)) { if (len <= 0 || (size_t)len >= sizeof(command)) {
errno = ENAMETOOLONG; errno = ENAMETOOLONG;
fatal("%s", infile); debug_return_int(NOT_FOUND_ERROR);
} }
found = sudo_goodpath(command, sbp); found = sudo_goodpath(command, sbp);
if (found && ignore_dot) if (found && ignore_dot)

View File

@@ -623,13 +623,18 @@ set_cmnd(void)
rval = find_path(NewArgv[0], &user_cmnd, user_stat, path, rval = find_path(NewArgv[0], &user_cmnd, user_stat, path,
def_ignore_dot); def_ignore_dot);
restore_perms(); restore_perms();
if (rval != FOUND) { if (rval == NOT_FOUND) {
/* Failed as root, try as invoking user. */ /* Failed as root, try as invoking user. */
set_perms(PERM_USER); set_perms(PERM_USER);
rval = find_path(NewArgv[0], &user_cmnd, user_stat, path, rval = find_path(NewArgv[0], &user_cmnd, user_stat, path,
def_ignore_dot); def_ignore_dot);
restore_perms(); restore_perms();
} }
if (rval == NOT_FOUND_ERROR) {
if (errno == ENAMETOOLONG)
audit_failure(NewArgv, N_("command too long"));
log_fatal(NO_MAIL|USE_ERRNO, NewArgv[0]);
}
} }
/* set user_args */ /* set user_args */
@@ -668,11 +673,6 @@ set_cmnd(void)
} }
} }
} }
if (strlen(user_cmnd) >= PATH_MAX) {
audit_failure(NewArgv, N_("command too long"));
errno = ENAMETOOLONG;
fatal("%s", user_cmnd);
}
if ((user_base = strrchr(user_cmnd, '/')) != NULL) if ((user_base = strrchr(user_cmnd, '/')) != NULL)
user_base++; user_base++;

View File

@@ -128,9 +128,10 @@ struct sudo_user {
/* /*
* find_path()/set_cmnd() return values * find_path()/set_cmnd() return values
*/ */
#define FOUND 0 #define FOUND 0
#define NOT_FOUND 1 #define NOT_FOUND 1
#define NOT_FOUND_DOT 2 #define NOT_FOUND_DOT 2
#define NOT_FOUND_ERROR 3
/* /*
* Various modes sudo can be in (based on arguments) in hex * Various modes sudo can be in (based on arguments) in hex