|
version 1.1.1.5, 2013/10/14 07:56:35
|
version 1.1.1.6, 2014/06/15 16:12:55
|
|
Line 54
|
Line 54
|
| #include <signal.h> |
#include <signal.h> |
| #include <grp.h> |
#include <grp.h> |
| #include <pwd.h> |
#include <pwd.h> |
| #if TIME_WITH_SYS_TIME | #ifdef TIME_WITH_SYS_TIME |
| # include <time.h> |
# include <time.h> |
| #endif |
#endif |
| #ifdef HAVE_LOGIN_CAP_H |
#ifdef HAVE_LOGIN_CAP_H |
|
Line 92
|
Line 92
|
| * Local variables |
* Local variables |
| */ |
*/ |
| struct plugin_container policy_plugin; |
struct plugin_container policy_plugin; |
| struct plugin_container_list io_plugins; | struct plugin_container_list io_plugins = TAILQ_HEAD_INITIALIZER(io_plugins); |
| struct user_details user_details; |
struct user_details user_details; |
| const char *list_user; /* extern for parse_args.c */ |
const char *list_user; /* extern for parse_args.c */ |
| static struct command_details command_details; |
static struct command_details command_details; |
|
Line 200 main(int argc, char *argv[], char *envp[])
|
Line 200 main(int argc, char *argv[], char *envp[])
|
| |
|
| /* Load plugins. */ |
/* Load plugins. */ |
| if (!sudo_load_plugins(&policy_plugin, &io_plugins)) |
if (!sudo_load_plugins(&policy_plugin, &io_plugins)) |
| fatalx(_("fatal error, unable to load plugins")); | fatalx(U_("fatal error, unable to load plugins")); |
| |
|
| /* Open policy plugin. */ |
/* Open policy plugin. */ |
| ok = policy_open(&policy_plugin, settings, user_info, envp); |
ok = policy_open(&policy_plugin, settings, user_info, envp); |
|
Line 208 main(int argc, char *argv[], char *envp[])
|
Line 208 main(int argc, char *argv[], char *envp[])
|
| if (ok == -2) |
if (ok == -2) |
| usage(1); |
usage(1); |
| else |
else |
| fatalx(_("unable to initialize policy plugin")); | fatalx(U_("unable to initialize policy plugin")); |
| } |
} |
| |
|
| init_signals(); |
init_signals(); |
|
Line 216 main(int argc, char *argv[], char *envp[])
|
Line 216 main(int argc, char *argv[], char *envp[])
|
| switch (sudo_mode & MODE_MASK) { |
switch (sudo_mode & MODE_MASK) { |
| case MODE_VERSION: |
case MODE_VERSION: |
| policy_show_version(&policy_plugin, !user_details.uid); |
policy_show_version(&policy_plugin, !user_details.uid); |
| tq_foreach_fwd(&io_plugins, plugin) { | TAILQ_FOREACH(plugin, &io_plugins, entries) { |
| ok = iolog_open(plugin, settings, user_info, NULL, |
ok = iolog_open(plugin, settings, user_info, NULL, |
| nargc, nargv, envp); |
nargc, nargv, envp); |
| if (ok != -1) |
if (ok != -1) |
|
Line 250 main(int argc, char *argv[], char *envp[])
|
Line 250 main(int argc, char *argv[], char *envp[])
|
| exit(1); /* plugin printed error message */ |
exit(1); /* plugin printed error message */ |
| } |
} |
| /* Open I/O plugins once policy plugin succeeds. */ |
/* Open I/O plugins once policy plugin succeeds. */ |
| for (plugin = io_plugins.first; plugin != NULL; plugin = next) { | TAILQ_FOREACH_SAFE(plugin, &io_plugins, entries, next) { |
| next = plugin->next; | |
| ok = iolog_open(plugin, settings, user_info, |
ok = iolog_open(plugin, settings, user_info, |
| command_info, nargc, nargv, envp); |
command_info, nargc, nargv, envp); |
| switch (ok) { |
switch (ok) { |
|
Line 265 main(int argc, char *argv[], char *envp[])
|
Line 264 main(int argc, char *argv[], char *envp[])
|
| usage(1); |
usage(1); |
| break; |
break; |
| default: |
default: |
| fatalx(_("error initializing I/O plugin %s"), | fatalx(U_("error initializing I/O plugin %s"), |
| plugin->name); |
plugin->name); |
| } |
} |
| } |
} |
|
Line 291 main(int argc, char *argv[], char *envp[])
|
Line 290 main(int argc, char *argv[], char *envp[])
|
| /* The close method was called by sudo_edit/run_command. */ |
/* The close method was called by sudo_edit/run_command. */ |
| break; |
break; |
| default: |
default: |
| fatalx(_("unexpected sudo mode 0x%x"), sudo_mode); | fatalx(U_("unexpected sudo mode 0x%x"), sudo_mode); |
| } |
} |
| sudo_debug_exit_int(__func__, __FILE__, __LINE__, sudo_debug_subsys, exitcode); |
sudo_debug_exit_int(__func__, __FILE__, __LINE__, sudo_debug_subsys, exitcode); |
| exit(exitcode); |
exit(exitcode); |
|
Line 300 main(int argc, char *argv[], char *envp[])
|
Line 299 main(int argc, char *argv[], char *envp[])
|
| int |
int |
| os_init_common(int argc, char *argv[], char *envp[]) |
os_init_common(int argc, char *argv[], char *envp[]) |
| { |
{ |
| #if !defined(HAVE_GETPROGNAME) && !defined(HAVE___PROGNAME) | initprogname(argc > 0 ? argv[0] : "sudo"); |
| if (argc > 0) | #ifdef STATIC_SUDOERS_PLUGIN |
| setprogname(argv[0]); | preload_static_symbols(); |
| #endif |
#endif |
| return 0; |
return 0; |
| } |
} |
|
Line 326 fix_fds(void)
|
Line 325 fix_fds(void)
|
| miss[STDERR_FILENO] = fcntl(STDERR_FILENO, F_GETFL, 0) == -1; |
miss[STDERR_FILENO] = fcntl(STDERR_FILENO, F_GETFL, 0) == -1; |
| if (miss[STDIN_FILENO] || miss[STDOUT_FILENO] || miss[STDERR_FILENO]) { |
if (miss[STDIN_FILENO] || miss[STDOUT_FILENO] || miss[STDERR_FILENO]) { |
| if ((devnull = open(_PATH_DEVNULL, O_RDWR, 0644)) == -1) |
if ((devnull = open(_PATH_DEVNULL, O_RDWR, 0644)) == -1) |
| fatal(_("unable to open %s"), _PATH_DEVNULL); | fatal(U_("unable to open %s"), _PATH_DEVNULL); |
| if (miss[STDIN_FILENO] && dup2(devnull, STDIN_FILENO) == -1) |
if (miss[STDIN_FILENO] && dup2(devnull, STDIN_FILENO) == -1) |
| fatal("dup2"); |
fatal("dup2"); |
| if (miss[STDOUT_FILENO] && dup2(devnull, STDOUT_FILENO) == -1) |
if (miss[STDOUT_FILENO] && dup2(devnull, STDOUT_FILENO) == -1) |
|
Line 411 get_user_groups(struct user_details *ud)
|
Line 410 get_user_groups(struct user_details *ud)
|
| * Typically, this is because NFS can only support up to 16 groups. |
* Typically, this is because NFS can only support up to 16 groups. |
| */ |
*/ |
| if (fill_group_list(ud, maxgroups) == -1) |
if (fill_group_list(ud, maxgroups) == -1) |
| fatal(_("unable to get group vector")); | fatal(U_("unable to get group vector")); |
| } |
} |
| |
|
| /* |
/* |
|
Line 463 get_user_info(struct user_details *ud)
|
Line 462 get_user_info(struct user_details *ud)
|
| |
|
| pw = getpwuid(ud->uid); |
pw = getpwuid(ud->uid); |
| if (pw == NULL) |
if (pw == NULL) |
| fatalx(_("unknown uid %u: who are you?"), (unsigned int)ud->uid); | fatalx(U_("unknown uid %u: who are you?"), (unsigned int)ud->uid); |
| |
|
| user_info[i] = fmt_string("user", pw->pw_name); |
user_info[i] = fmt_string("user", pw->pw_name); |
| if (user_info[i] == NULL) |
if (user_info[i] == NULL) |
|
Line 531 command_info_to_details(char * const info[], struct co
|
Line 530 command_info_to_details(char * const info[], struct co
|
| { |
{ |
| int i; |
int i; |
| id_t id; |
id_t id; |
| long lval; | char *cp; |
| char *cp, *ep; | |
| const char *errstr; |
const char *errstr; |
| debug_decl(command_info_to_details, SUDO_DEBUG_PCOMM) |
debug_decl(command_info_to_details, SUDO_DEBUG_PCOMM) |
| |
|
| memset(details, 0, sizeof(*details)); |
memset(details, 0, sizeof(*details)); |
| details->closefrom = -1; |
details->closefrom = -1; |
| |
TAILQ_INIT(&details->preserved_fds); |
| |
|
| #define SET_STRING(s, n) \ |
#define SET_STRING(s, n) \ |
| if (strncmp(s, info[i], sizeof(s) - 1) == 0 && info[i][sizeof(s) - 1]) { \ |
if (strncmp(s, info[i], sizeof(s) - 1) == 0 && info[i][sizeof(s) - 1]) { \ |
|
Line 554 command_info_to_details(char * const info[], struct co
|
Line 553 command_info_to_details(char * const info[], struct co
|
| SET_STRING("command=", command) |
SET_STRING("command=", command) |
| SET_STRING("cwd=", cwd) |
SET_STRING("cwd=", cwd) |
| if (strncmp("closefrom=", info[i], sizeof("closefrom=") - 1) == 0) { |
if (strncmp("closefrom=", info[i], sizeof("closefrom=") - 1) == 0) { |
| errno = 0; |
|
| cp = info[i] + sizeof("closefrom=") - 1; |
cp = info[i] + sizeof("closefrom=") - 1; |
| lval = strtol(cp, &ep, 10); | details->closefrom = strtonum(cp, 0, INT_MAX, &errstr); |
| if (*cp == '\0' || *ep != '\0') | if (errstr != NULL) |
| fatalx(_("%s: %s"), info[i], _("invalid value")); | fatalx(U_("%s: %s"), info[i], U_(errstr)); |
| if ((errno == ERANGE && | |
| (lval == LONG_MAX || lval == LONG_MIN)) || | |
| (lval > INT_MAX || lval < 0)) | |
| fatalx(_("%s: %s"), info[i], _("value out of range")); | |
| details->closefrom = (int)lval; | |
| break; |
break; |
| } |
} |
| break; |
break; |
|
Line 579 command_info_to_details(char * const info[], struct co
|
Line 572 command_info_to_details(char * const info[], struct co
|
| break; |
break; |
| case 'n': |
case 'n': |
| if (strncmp("nice=", info[i], sizeof("nice=") - 1) == 0) { |
if (strncmp("nice=", info[i], sizeof("nice=") - 1) == 0) { |
| errno = 0; |
|
| cp = info[i] + sizeof("nice=") - 1; |
cp = info[i] + sizeof("nice=") - 1; |
| lval = strtol(cp, &ep, 10); | details->priority = strtonum(cp, INT_MIN, INT_MAX, &errstr); |
| if (*cp == '\0' || *ep != '\0') | if (errstr != NULL) |
| fatalx(_("%s: %s"), info[i], _("invalid value")); | fatalx(U_("%s: %s"), info[i], U_(errstr)); |
| if ((errno == ERANGE && | |
| (lval == LONG_MAX || lval == LONG_MIN)) || | |
| (lval > INT_MAX || lval < INT_MIN)) | |
| fatalx(_("%s: %s"), info[i], _("value out of range")); | |
| details->priority = (int)lval; | |
| SET(details->flags, CD_SET_PRIORITY); |
SET(details->flags, CD_SET_PRIORITY); |
| break; |
break; |
| } |
} |
|
Line 604 command_info_to_details(char * const info[], struct co
|
Line 591 command_info_to_details(char * const info[], struct co
|
| SET(details->flags, CD_PRESERVE_GROUPS); |
SET(details->flags, CD_PRESERVE_GROUPS); |
| break; |
break; |
| } |
} |
| |
if (strncmp("preserve_fds=", info[i], sizeof("preserve_fds=") - 1) == 0) { |
| |
parse_preserved_fds(&details->preserved_fds, |
| |
info[i] + sizeof("preserve_fds=") - 1); |
| |
break; |
| |
} |
| break; |
break; |
| case 'r': |
case 'r': |
| if (strncmp("runas_egid=", info[i], sizeof("runas_egid=") - 1) == 0) { |
if (strncmp("runas_egid=", info[i], sizeof("runas_egid=") - 1) == 0) { |
| cp = info[i] + sizeof("runas_egid=") - 1; |
cp = info[i] + sizeof("runas_egid=") - 1; |
| id = atoid(cp, NULL, NULL, &errstr); |
id = atoid(cp, NULL, NULL, &errstr); |
| if (errstr != NULL) |
if (errstr != NULL) |
| fatalx(_("%s: %s"), info[i], _(errstr)); | fatalx(U_("%s: %s"), info[i], U_(errstr)); |
| details->egid = (gid_t)id; |
details->egid = (gid_t)id; |
| SET(details->flags, CD_SET_EGID); |
SET(details->flags, CD_SET_EGID); |
| break; |
break; |
|
Line 619 command_info_to_details(char * const info[], struct co
|
Line 611 command_info_to_details(char * const info[], struct co
|
| cp = info[i] + sizeof("runas_euid=") - 1; |
cp = info[i] + sizeof("runas_euid=") - 1; |
| id = atoid(cp, NULL, NULL, &errstr); |
id = atoid(cp, NULL, NULL, &errstr); |
| if (errstr != NULL) |
if (errstr != NULL) |
| fatalx(_("%s: %s"), info[i], _(errstr)); | fatalx(U_("%s: %s"), info[i], U_(errstr)); |
| details->euid = (uid_t)id; |
details->euid = (uid_t)id; |
| SET(details->flags, CD_SET_EUID); |
SET(details->flags, CD_SET_EUID); |
| break; |
break; |
|
Line 628 command_info_to_details(char * const info[], struct co
|
Line 620 command_info_to_details(char * const info[], struct co
|
| cp = info[i] + sizeof("runas_gid=") - 1; |
cp = info[i] + sizeof("runas_gid=") - 1; |
| id = atoid(cp, NULL, NULL, &errstr); |
id = atoid(cp, NULL, NULL, &errstr); |
| if (errstr != NULL) |
if (errstr != NULL) |
| fatalx(_("%s: %s"), info[i], _(errstr)); | fatalx(U_("%s: %s"), info[i], U_(errstr)); |
| details->gid = (gid_t)id; |
details->gid = (gid_t)id; |
| SET(details->flags, CD_SET_GID); |
SET(details->flags, CD_SET_GID); |
| break; |
break; |
|
Line 643 command_info_to_details(char * const info[], struct co
|
Line 635 command_info_to_details(char * const info[], struct co
|
| cp = info[i] + sizeof("runas_uid=") - 1; |
cp = info[i] + sizeof("runas_uid=") - 1; |
| id = atoid(cp, NULL, NULL, &errstr); |
id = atoid(cp, NULL, NULL, &errstr); |
| if (errstr != NULL) |
if (errstr != NULL) |
| fatalx(_("%s: %s"), info[i], _(errstr)); | fatalx(U_("%s: %s"), info[i], U_(errstr)); |
| details->uid = (uid_t)id; |
details->uid = (uid_t)id; |
| SET(details->flags, CD_SET_UID); |
SET(details->flags, CD_SET_UID); |
| break; |
break; |
|
Line 687 command_info_to_details(char * const info[], struct co
|
Line 679 command_info_to_details(char * const info[], struct co
|
| break; |
break; |
| case 't': |
case 't': |
| if (strncmp("timeout=", info[i], sizeof("timeout=") - 1) == 0) { |
if (strncmp("timeout=", info[i], sizeof("timeout=") - 1) == 0) { |
| errno = 0; |
|
| cp = info[i] + sizeof("timeout=") - 1; |
cp = info[i] + sizeof("timeout=") - 1; |
| lval = strtol(cp, &ep, 10); | details->timeout = strtonum(cp, 0, INT_MAX, &errstr); |
| if (*cp == '\0' || *ep != '\0') | if (errstr != NULL) |
| fatalx(_("%s: %s"), info[i], _("invalid value")); | fatalx(U_("%s: %s"), info[i], U_(errstr)); |
| if ((errno == ERANGE && | |
| (lval == LONG_MAX || lval == LONG_MIN)) || | |
| (lval > INT_MAX || lval < 0)) | |
| fatalx(_("%s: %s"), info[i], _("value out of range")); | |
| details->timeout = (int)lval; | |
| SET(details->flags, CD_SET_TIMEOUT); |
SET(details->flags, CD_SET_TIMEOUT); |
| break; |
break; |
| } |
} |
| break; |
break; |
| case 'u': |
case 'u': |
| if (strncmp("umask=", info[i], sizeof("umask=") - 1) == 0) { |
if (strncmp("umask=", info[i], sizeof("umask=") - 1) == 0) { |
| errno = 0; |
|
| cp = info[i] + sizeof("umask=") - 1; |
cp = info[i] + sizeof("umask=") - 1; |
| lval = strtol(cp, &ep, 8); | details->umask = atomode(cp, &errstr); |
| if (*cp == '\0' || *ep != '\0') | if (errstr != NULL) |
| fatalx(_("%s: %s"), info[i], _("invalid value")); | fatalx(U_("%s: %s"), info[i], U_(errstr)); |
| if ((errno == ERANGE && | |
| (lval == LONG_MAX || lval == LONG_MIN)) || | |
| (lval > 0777 || lval < 0)) | |
| fatalx(_("%s: %s"), info[i], _("value out of range")); | |
| details->umask = (mode_t)lval; | |
| SET(details->flags, CD_SET_UMASK); |
SET(details->flags, CD_SET_UMASK); |
| break; |
break; |
| } |
} |
|
Line 768 sudo_check_suid(const char *sudo)
|
Line 748 sudo_check_suid(const char *sudo)
|
| if ((colon = strchr(cp, ':'))) |
if ((colon = strchr(cp, ':'))) |
| *colon = '\0'; |
*colon = '\0'; |
| len = snprintf(pathbuf, sizeof(pathbuf), "%s/%s", cp, sudo); |
len = snprintf(pathbuf, sizeof(pathbuf), "%s/%s", cp, sudo); |
| if (len <= 0 || len >= sizeof(pathbuf)) | if (len <= 0 || (size_t)len >= sizeof(pathbuf)) |
| continue; |
continue; |
| if (access(pathbuf, X_OK) == 0) { |
if (access(pathbuf, X_OK) == 0) { |
| sudo = pathbuf; |
sudo = pathbuf; |
|
Line 785 sudo_check_suid(const char *sudo)
|
Line 765 sudo_check_suid(const char *sudo)
|
| /* Try to determine why sudo was not running as root. */ |
/* Try to determine why sudo was not running as root. */ |
| if (sb.st_uid != ROOT_UID || !ISSET(sb.st_mode, S_ISUID)) { |
if (sb.st_uid != ROOT_UID || !ISSET(sb.st_mode, S_ISUID)) { |
| fatalx( |
fatalx( |
| _("%s must be owned by uid %d and have the setuid bit set"), | U_("%s must be owned by uid %d and have the setuid bit set"), |
| sudo, ROOT_UID); |
sudo, ROOT_UID); |
| } else { |
} else { |
| fatalx(_("effective uid is not %d, is %s on a file system " | fatalx(U_("effective uid is not %d, is %s on a file system " |
| "with the 'nosuid' option set or an NFS file system without" |
"with the 'nosuid' option set or an NFS file system without" |
| " root privileges?"), ROOT_UID, sudo); |
" root privileges?"), ROOT_UID, sudo); |
| } |
} |
| } else { |
} else { |
| fatalx( |
fatalx( |
| _("effective uid is not %d, is sudo installed setuid root?"), | U_("effective uid is not %d, is sudo installed setuid root?"), |
| ROOT_UID); |
ROOT_UID); |
| } |
} |
| } |
} |
|
Line 920 exec_setup(struct command_details *details, const char
|
Line 900 exec_setup(struct command_details *details, const char
|
| */ |
*/ |
| lc = login_getclass((char *)details->login_class); |
lc = login_getclass((char *)details->login_class); |
| if (!lc) { |
if (!lc) { |
| warningx(_("unknown login class %s"), details->login_class); | warningx(U_("unknown login class %s"), details->login_class); |
| errno = ENOENT; |
errno = ENOENT; |
| goto done; |
goto done; |
| } |
} |
|
Line 933 exec_setup(struct command_details *details, const char
|
Line 913 exec_setup(struct command_details *details, const char
|
| flags = LOGIN_SETRESOURCES|LOGIN_SETPRIORITY; |
flags = LOGIN_SETRESOURCES|LOGIN_SETPRIORITY; |
| } |
} |
| if (setusercontext(lc, details->pw, details->pw->pw_uid, flags)) { |
if (setusercontext(lc, details->pw, details->pw->pw_uid, flags)) { |
| warning(_("unable to set user context")); | warning(U_("unable to set user context")); |
| if (details->pw->pw_uid != ROOT_UID) |
if (details->pw->pw_uid != ROOT_UID) |
| goto done; |
goto done; |
| } |
} |
|
Line 947 exec_setup(struct command_details *details, const char
|
Line 927 exec_setup(struct command_details *details, const char
|
| if (!ISSET(details->flags, CD_PRESERVE_GROUPS)) { |
if (!ISSET(details->flags, CD_PRESERVE_GROUPS)) { |
| if (details->ngroups >= 0) { |
if (details->ngroups >= 0) { |
| if (sudo_setgroups(details->ngroups, details->groups) < 0) { |
if (sudo_setgroups(details->ngroups, details->groups) < 0) { |
| warning(_("unable to set supplementary group IDs")); | warning(U_("unable to set supplementary group IDs")); |
| goto done; |
goto done; |
| } |
} |
| } |
} |
| } |
} |
| #ifdef HAVE_SETEUID |
#ifdef HAVE_SETEUID |
| if (ISSET(details->flags, CD_SET_EGID) && setegid(details->egid)) { |
if (ISSET(details->flags, CD_SET_EGID) && setegid(details->egid)) { |
| warning(_("unable to set effective gid to runas gid %u"), | warning(U_("unable to set effective gid to runas gid %u"), |
| (unsigned int)details->egid); |
(unsigned int)details->egid); |
| goto done; |
goto done; |
| } |
} |
| #endif |
#endif |
| if (ISSET(details->flags, CD_SET_GID) && setgid(details->gid)) { |
if (ISSET(details->flags, CD_SET_GID) && setgid(details->gid)) { |
| warning(_("unable to set gid to runas gid %u"), | warning(U_("unable to set gid to runas gid %u"), |
| (unsigned int)details->gid); |
(unsigned int)details->gid); |
| goto done; |
goto done; |
| } |
} |
| |
|
| if (ISSET(details->flags, CD_SET_PRIORITY)) { |
if (ISSET(details->flags, CD_SET_PRIORITY)) { |
| if (setpriority(PRIO_PROCESS, 0, details->priority) != 0) { |
if (setpriority(PRIO_PROCESS, 0, details->priority) != 0) { |
| warning(_("unable to set process priority")); | warning(U_("unable to set process priority")); |
| goto done; |
goto done; |
| } |
} |
| } |
} |
|
Line 975 exec_setup(struct command_details *details, const char
|
Line 955 exec_setup(struct command_details *details, const char
|
| (void) umask(details->umask); |
(void) umask(details->umask); |
| if (details->chroot) { |
if (details->chroot) { |
| if (chroot(details->chroot) != 0 || chdir("/") != 0) { |
if (chroot(details->chroot) != 0 || chdir("/") != 0) { |
| warning(_("unable to change root to %s"), details->chroot); | warning(U_("unable to change root to %s"), details->chroot); |
| goto done; |
goto done; |
| } |
} |
| } |
} |
|
Line 988 exec_setup(struct command_details *details, const char
|
Line 968 exec_setup(struct command_details *details, const char
|
| |
|
| #ifdef HAVE_SETRESUID |
#ifdef HAVE_SETRESUID |
| if (setresuid(details->uid, details->euid, details->euid) != 0) { |
if (setresuid(details->uid, details->euid, details->euid) != 0) { |
| warning(_("unable to change to runas uid (%u, %u)"), details->uid, | warning(U_("unable to change to runas uid (%u, %u)"), details->uid, |
| details->euid); |
details->euid); |
| goto done; |
goto done; |
| } |
} |
| #elif HAVE_SETREUID | #elif defined(HAVE_SETREUID) |
| if (setreuid(details->uid, details->euid) != 0) { |
if (setreuid(details->uid, details->euid) != 0) { |
| warning(_("unable to change to runas uid (%u, %u)"), | warning(U_("unable to change to runas uid (%u, %u)"), |
| (unsigned int)details->uid, (unsigned int)details->euid); |
(unsigned int)details->uid, (unsigned int)details->euid); |
| goto done; |
goto done; |
| } |
} |
| #else |
#else |
| if (seteuid(details->euid) != 0 || setuid(details->euid) != 0) { |
if (seteuid(details->euid) != 0 || setuid(details->euid) != 0) { |
| warning(_("unable to change to runas uid (%u, %u)"), details->uid, | warning(U_("unable to change to runas uid (%u, %u)"), details->uid, |
| details->euid); |
details->euid); |
| goto done; |
goto done; |
| } |
} |
|
Line 1017 exec_setup(struct command_details *details, const char
|
Line 997 exec_setup(struct command_details *details, const char
|
| if (details->chroot || strcmp(details->cwd, user_details.cwd) != 0) { |
if (details->chroot || strcmp(details->cwd, user_details.cwd) != 0) { |
| /* Note: cwd is relative to the new root, if any. */ |
/* Note: cwd is relative to the new root, if any. */ |
| if (chdir(details->cwd) != 0) { |
if (chdir(details->cwd) != 0) { |
| warning(_("unable to change directory to %s"), details->cwd); | warning(U_("unable to change directory to %s"), details->cwd); |
| goto done; |
goto done; |
| } |
} |
| } |
} |
|
Line 1051 run_command(struct command_details *details)
|
Line 1031 run_command(struct command_details *details)
|
| sudo_debug_printf(SUDO_DEBUG_DEBUG, |
sudo_debug_printf(SUDO_DEBUG_DEBUG, |
| "calling policy close with errno %d", cstat.val); |
"calling policy close with errno %d", cstat.val); |
| policy_close(&policy_plugin, 0, cstat.val); |
policy_close(&policy_plugin, 0, cstat.val); |
| tq_foreach_fwd(&io_plugins, plugin) { | TAILQ_FOREACH(plugin, &io_plugins, entries) { |
| sudo_debug_printf(SUDO_DEBUG_DEBUG, |
sudo_debug_printf(SUDO_DEBUG_DEBUG, |
| "calling I/O close with errno %d", cstat.val); |
"calling I/O close with errno %d", cstat.val); |
| iolog_close(plugin, 0, cstat.val); |
iolog_close(plugin, 0, cstat.val); |
|
Line 1063 run_command(struct command_details *details)
|
Line 1043 run_command(struct command_details *details)
|
| sudo_debug_printf(SUDO_DEBUG_DEBUG, |
sudo_debug_printf(SUDO_DEBUG_DEBUG, |
| "calling policy close with wait status %d", cstat.val); |
"calling policy close with wait status %d", cstat.val); |
| policy_close(&policy_plugin, cstat.val, 0); |
policy_close(&policy_plugin, cstat.val, 0); |
| tq_foreach_fwd(&io_plugins, plugin) { | TAILQ_FOREACH(plugin, &io_plugins, entries) { |
| sudo_debug_printf(SUDO_DEBUG_DEBUG, |
sudo_debug_printf(SUDO_DEBUG_DEBUG, |
| "calling I/O close with wait status %d", cstat.val); |
"calling I/O close with wait status %d", cstat.val); |
| iolog_close(plugin, cstat.val, 0); |
iolog_close(plugin, cstat.val, 0); |
|
Line 1074 run_command(struct command_details *details)
|
Line 1054 run_command(struct command_details *details)
|
| exitcode = WTERMSIG(cstat.val) | 128; |
exitcode = WTERMSIG(cstat.val) | 128; |
| break; |
break; |
| default: |
default: |
| warningx(_("unexpected child termination condition: %d"), cstat.type); | warningx(U_("unexpected child termination condition: %d"), cstat.type); |
| break; |
break; |
| } |
} |
| debug_return_int(exitcode); |
debug_return_int(exitcode); |
|
Line 1111 policy_close(struct plugin_container *plugin, int exit
|
Line 1091 policy_close(struct plugin_container *plugin, int exit
|
| if (plugin->u.policy->close != NULL) |
if (plugin->u.policy->close != NULL) |
| plugin->u.policy->close(exit_status, error); |
plugin->u.policy->close(exit_status, error); |
| else |
else |
| warning(_("unable to execute %s"), command_details.command); | warning(U_("unable to execute %s"), command_details.command); |
| debug_return; |
debug_return; |
| } |
} |
| |
|
|
Line 1131 policy_check(struct plugin_container *plugin, int argc
|
Line 1111 policy_check(struct plugin_container *plugin, int argc
|
| { |
{ |
| debug_decl(policy_check, SUDO_DEBUG_PCOMM) |
debug_decl(policy_check, SUDO_DEBUG_PCOMM) |
| if (plugin->u.policy->check_policy == NULL) { |
if (plugin->u.policy->check_policy == NULL) { |
| fatalx(_("policy plugin %s is missing the `check_policy' method"), | fatalx(U_("policy plugin %s is missing the `check_policy' method"), |
| plugin->name); |
plugin->name); |
| } |
} |
| debug_return_bool(plugin->u.policy->check_policy(argc, argv, env_add, |
debug_return_bool(plugin->u.policy->check_policy(argc, argv, env_add, |
|
Line 1144 policy_list(struct plugin_container *plugin, int argc,
|
Line 1124 policy_list(struct plugin_container *plugin, int argc,
|
| { |
{ |
| debug_decl(policy_list, SUDO_DEBUG_PCOMM) |
debug_decl(policy_list, SUDO_DEBUG_PCOMM) |
| if (plugin->u.policy->list == NULL) { |
if (plugin->u.policy->list == NULL) { |
| warningx(_("policy plugin %s does not support listing privileges"), | warningx(U_("policy plugin %s does not support listing privileges"), |
| plugin->name); |
plugin->name); |
| debug_return_bool(false); |
debug_return_bool(false); |
| } |
} |
|
Line 1156 policy_validate(struct plugin_container *plugin)
|
Line 1136 policy_validate(struct plugin_container *plugin)
|
| { |
{ |
| debug_decl(policy_validate, SUDO_DEBUG_PCOMM) |
debug_decl(policy_validate, SUDO_DEBUG_PCOMM) |
| if (plugin->u.policy->validate == NULL) { |
if (plugin->u.policy->validate == NULL) { |
| warningx(_("policy plugin %s does not support the -v option"), | warningx(U_("policy plugin %s does not support the -v option"), |
| plugin->name); |
plugin->name); |
| debug_return_bool(false); |
debug_return_bool(false); |
| } |
} |
|
Line 1168 policy_invalidate(struct plugin_container *plugin, int
|
Line 1148 policy_invalidate(struct plugin_container *plugin, int
|
| { |
{ |
| debug_decl(policy_invalidate, SUDO_DEBUG_PCOMM) |
debug_decl(policy_invalidate, SUDO_DEBUG_PCOMM) |
| if (plugin->u.policy->invalidate == NULL) { |
if (plugin->u.policy->invalidate == NULL) { |
| fatalx(_("policy plugin %s does not support the -k/-K options"), | fatalx(U_("policy plugin %s does not support the -k/-K options"), |
| plugin->name); |
plugin->name); |
| } |
} |
| plugin->u.policy->invalidate(remove); |
plugin->u.policy->invalidate(remove); |
|
Line 1262 iolog_unlink(struct plugin_container *plugin)
|
Line 1242 iolog_unlink(struct plugin_container *plugin)
|
| deregister_hook); |
deregister_hook); |
| } |
} |
| /* Remove from io_plugins list and free. */ |
/* Remove from io_plugins list and free. */ |
| tq_remove(&io_plugins, plugin); | TAILQ_REMOVE(&io_plugins, plugin, entries); |
| efree(plugin); |
efree(plugin); |
| |
|
| debug_return; |
debug_return; |