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:
@@ -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)
|
||||||
|
@@ -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++;
|
||||||
|
@@ -131,6 +131,7 @@ struct sudo_user {
|
|||||||
#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
|
||||||
|
Reference in New Issue
Block a user