Reduce the number of function args passed to plugin wrappers.
This makes sudo_settings, user_info, submit_argv, submit_envp and submit_optind global. This will be required for calling the wrapper from outside of sudo.c where we may not have access to those variables.
This commit is contained in:
239
src/sudo.c
239
src/sudo.c
@@ -104,54 +104,48 @@ static void command_info_to_details(char * const info[],
|
||||
static void gc_init(void);
|
||||
|
||||
/* Policy plugin convenience functions. */
|
||||
static void policy_open(struct sudo_settings *settings,
|
||||
char * const user_info[], char * const user_env[]);
|
||||
static void policy_open(void);
|
||||
static void policy_close(int exit_status, int error);
|
||||
static int policy_show_version(int verbose);
|
||||
static bool policy_check(int argc, char * const argv[], char *env_add[],
|
||||
char **command_info[], char **argv_out[], char **user_env_out[]);
|
||||
char **command_info[], char **run_argv[], char **run_envp[]);
|
||||
static void policy_list(int argc, char * const argv[],
|
||||
int verbose, const char *user, char * const envp[]);
|
||||
static void policy_validate(char * const argv[], char * const envp[]);
|
||||
int verbose, const char *user);
|
||||
static void policy_validate(char * const argv[]);
|
||||
static void policy_invalidate(int unlinkit);
|
||||
|
||||
/* I/O log plugin convenience functions. */
|
||||
static bool iolog_open(struct sudo_settings *settings, char * const user_info[],
|
||||
char * const command_details[], int argc, char * const argv[],
|
||||
char * const user_env[]);
|
||||
static bool iolog_open(char * const command_info[], int run_argc,
|
||||
char * const run_argv[], char * const run_envp[]);
|
||||
static void iolog_close(int exit_status, int error);
|
||||
static void iolog_show_version(int verbose, struct sudo_settings *settings,
|
||||
char * const user_info[], int argc, char * const argv[],
|
||||
char * const user_env[]);
|
||||
static void iolog_show_version(int verbose, int argc, char * const argv[],
|
||||
char * const envp[]);
|
||||
static void unlink_plugin(struct plugin_container_list *plugin_list, struct plugin_container *plugin);
|
||||
static void free_plugin_container(struct plugin_container *plugin, bool ioplugin);
|
||||
|
||||
/* Audit plugin convenience functions. */
|
||||
static void audit_open(struct sudo_settings *settings, char * const user_info[],
|
||||
int submit_optind, char * const submit_argv[], char * const submit_envp[]);
|
||||
static void audit_open(void);
|
||||
static void audit_close(int exit_status, int error);
|
||||
static void audit_show_version(int verbose);
|
||||
|
||||
/* Approval plugin convenience functions. */
|
||||
static bool approval_check(struct sudo_settings *settings,
|
||||
char * const user_info[], int submit_optind, char * const submit_argv[],
|
||||
char * const submit_envp[], char * const command_info[],
|
||||
char * const run_argv[], char * const run_envp[]);
|
||||
static void approval_show_version(int verbose, struct sudo_settings *settings,
|
||||
char * const user_info[], int submit_optind, char * const submit_argv[],
|
||||
char * const submit_envp[]);
|
||||
static bool approval_check(char * const command_info[], char * const run_argv[],
|
||||
char * const run_envp[]);
|
||||
static void approval_show_version(int verbose);
|
||||
|
||||
sudo_dso_public int main(int argc, char *argv[], char *envp[]);
|
||||
|
||||
static struct sudo_settings *sudo_settings;
|
||||
static char * const *user_info, * const *submit_argv, * const *submit_envp;
|
||||
static int submit_optind;
|
||||
|
||||
int
|
||||
main(int argc, char *argv[], char *envp[])
|
||||
{
|
||||
int nargc, status = 0;
|
||||
char **nargv, **env_add, **user_info;
|
||||
char **command_info = NULL, **argv_out = NULL, **user_env_out = NULL;
|
||||
char **nargv, **env_add;
|
||||
char **command_info = NULL, **argv_out = NULL, **run_envp = NULL;
|
||||
const char * const allowed_prognames[] = { "sudo", "sudoedit", NULL };
|
||||
struct sudo_settings *settings;
|
||||
int submit_optind;
|
||||
sigset_t mask;
|
||||
debug_decl_vars(main, SUDO_DEBUG_MAIN);
|
||||
|
||||
@@ -209,9 +203,11 @@ main(int argc, char *argv[], char *envp[])
|
||||
if (sudo_conf_disable_coredump())
|
||||
disable_coredump();
|
||||
|
||||
/* Parse command line arguments. */
|
||||
/* Parse command line arguments, preserving the original argv/envp. */
|
||||
submit_argv = argv;
|
||||
submit_envp = envp;
|
||||
sudo_mode = parse_args(argc, argv, &submit_optind, &nargc, &nargv,
|
||||
&settings, &env_add);
|
||||
&sudo_settings, &env_add);
|
||||
sudo_debug_printf(SUDO_DEBUG_DEBUG, "sudo_mode %d", sudo_mode);
|
||||
|
||||
/* Print sudo version early, in case of plugin init failure. */
|
||||
@@ -234,21 +230,20 @@ main(int argc, char *argv[], char *envp[])
|
||||
|
||||
/* Open policy and audit plugins. */
|
||||
/* XXX - audit policy_open errors */
|
||||
audit_open(settings, user_info, submit_optind, argv, envp);
|
||||
policy_open(settings, user_info, envp);
|
||||
audit_open();
|
||||
policy_open();
|
||||
|
||||
switch (sudo_mode & MODE_MASK) {
|
||||
case MODE_VERSION:
|
||||
policy_show_version(!user_details.cred.uid);
|
||||
iolog_show_version(!user_details.cred.uid, settings, user_info,
|
||||
nargc, nargv, envp);
|
||||
approval_show_version(!user_details.cred.uid, settings, user_info,
|
||||
submit_optind, argv, envp);
|
||||
iolog_show_version(!user_details.cred.uid, nargc, nargv,
|
||||
submit_envp);
|
||||
approval_show_version(!user_details.cred.uid);
|
||||
audit_show_version(!user_details.cred.uid);
|
||||
break;
|
||||
case MODE_VALIDATE:
|
||||
case MODE_VALIDATE|MODE_INVALIDATE:
|
||||
policy_validate(nargv, envp);
|
||||
policy_validate(nargv);
|
||||
break;
|
||||
case MODE_KILL:
|
||||
case MODE_INVALIDATE:
|
||||
@@ -259,12 +254,12 @@ main(int argc, char *argv[], char *envp[])
|
||||
case MODE_LIST:
|
||||
case MODE_LIST|MODE_INVALIDATE:
|
||||
policy_list(nargc, nargv, ISSET(sudo_mode, MODE_LONG_LIST),
|
||||
list_user, envp);
|
||||
list_user);
|
||||
break;
|
||||
case MODE_EDIT:
|
||||
case MODE_RUN:
|
||||
if (!policy_check(nargc, nargv, env_add, &command_info, &argv_out,
|
||||
&user_env_out))
|
||||
&run_envp))
|
||||
goto access_denied;
|
||||
|
||||
/* Reset nargv/nargc based on argv_out. */
|
||||
@@ -276,25 +271,23 @@ main(int argc, char *argv[], char *envp[])
|
||||
U_("plugin did not return a command to execute"));
|
||||
|
||||
/* Approval plugins run after policy plugin accepts the command. */
|
||||
if (!approval_check(settings, user_info, submit_optind, argv, envp,
|
||||
command_info, nargv, user_env_out))
|
||||
if (!approval_check(command_info, nargv, run_envp))
|
||||
goto access_denied;
|
||||
|
||||
/* Open I/O plugin once policy and approval plugins succeed. */
|
||||
if (!iolog_open(settings, user_info, command_info, nargc, nargv,
|
||||
user_env_out))
|
||||
if (!iolog_open(command_info, nargc, nargv, run_envp))
|
||||
goto access_denied;
|
||||
|
||||
/* Audit the accept event on behalf of the sudo front-end. */
|
||||
if (!audit_accept("sudo", SUDO_FRONT_END, command_info,
|
||||
nargv, user_env_out))
|
||||
nargv, run_envp))
|
||||
goto access_denied;
|
||||
|
||||
/* Setup command details and run command/edit. */
|
||||
command_info_to_details(command_info, &command_details);
|
||||
command_details.tty = user_details.tty;
|
||||
command_details.argv = argv_out;
|
||||
command_details.envp = user_env_out;
|
||||
command_details.envp = run_envp;
|
||||
command_details.evbase = sudo_event_base;
|
||||
if (ISSET(sudo_mode, MODE_LOGIN_SHELL))
|
||||
SET(command_details.flags, CD_LOGIN_SHELL);
|
||||
@@ -503,8 +496,8 @@ done:
|
||||
static char **
|
||||
get_user_info(struct user_details *ud)
|
||||
{
|
||||
char *cp, **user_info, path[PATH_MAX];
|
||||
size_t user_info_max = 32 + RLIM_NLIMITS;
|
||||
char *cp, **info, path[PATH_MAX];
|
||||
size_t info_max = 32 + RLIM_NLIMITS;
|
||||
unsigned int i = 0;
|
||||
mode_t mask;
|
||||
struct passwd *pw;
|
||||
@@ -527,8 +520,8 @@ get_user_info(struct user_details *ud)
|
||||
memset(ud, 0, sizeof(*ud));
|
||||
|
||||
/* XXX - bound check number of entries */
|
||||
user_info = reallocarray(NULL, user_info_max, sizeof(char *));
|
||||
if (user_info == NULL)
|
||||
info = reallocarray(NULL, info_max, sizeof(char *));
|
||||
if (info == NULL)
|
||||
goto oom;
|
||||
|
||||
ud->pid = getpid();
|
||||
@@ -558,10 +551,10 @@ get_user_info(struct user_details *ud)
|
||||
if (pw == NULL)
|
||||
sudo_fatalx(U_("you do not exist in the %s database"), "passwd");
|
||||
|
||||
user_info[i] = sudo_new_key_val("user", pw->pw_name);
|
||||
if (user_info[i] == NULL)
|
||||
info[i] = sudo_new_key_val("user", pw->pw_name);
|
||||
if (info[i] == NULL)
|
||||
goto oom;
|
||||
ud->username = user_info[i] + sizeof("user=") - 1;
|
||||
ud->username = info[i] + sizeof("user=") - 1;
|
||||
|
||||
/* Stash user's shell for use with the -s flag; don't pass to plugin. */
|
||||
if ((ud->shell = getenv("SHELL")) == NULL || ud->shell[0] == '\0') {
|
||||
@@ -570,46 +563,46 @@ get_user_info(struct user_details *ud)
|
||||
if ((ud->shell = strdup(ud->shell)) == NULL)
|
||||
goto oom;
|
||||
|
||||
if (asprintf(&user_info[++i], "pid=%d", (int)ud->pid) == -1)
|
||||
if (asprintf(&info[++i], "pid=%d", (int)ud->pid) == -1)
|
||||
goto oom;
|
||||
if (asprintf(&user_info[++i], "ppid=%d", (int)ud->ppid) == -1)
|
||||
if (asprintf(&info[++i], "ppid=%d", (int)ud->ppid) == -1)
|
||||
goto oom;
|
||||
if (asprintf(&user_info[++i], "pgid=%d", (int)ud->pgid) == -1)
|
||||
if (asprintf(&info[++i], "pgid=%d", (int)ud->pgid) == -1)
|
||||
goto oom;
|
||||
if (asprintf(&user_info[++i], "tcpgid=%d", (int)ud->tcpgid) == -1)
|
||||
if (asprintf(&info[++i], "tcpgid=%d", (int)ud->tcpgid) == -1)
|
||||
goto oom;
|
||||
if (asprintf(&user_info[++i], "sid=%d", (int)ud->sid) == -1)
|
||||
if (asprintf(&info[++i], "sid=%d", (int)ud->sid) == -1)
|
||||
goto oom;
|
||||
if (asprintf(&user_info[++i], "uid=%u", (unsigned int)ud->cred.uid) == -1)
|
||||
if (asprintf(&info[++i], "uid=%u", (unsigned int)ud->cred.uid) == -1)
|
||||
goto oom;
|
||||
if (asprintf(&user_info[++i], "euid=%u", (unsigned int)ud->cred.euid) == -1)
|
||||
if (asprintf(&info[++i], "euid=%u", (unsigned int)ud->cred.euid) == -1)
|
||||
goto oom;
|
||||
if (asprintf(&user_info[++i], "gid=%u", (unsigned int)ud->cred.gid) == -1)
|
||||
if (asprintf(&info[++i], "gid=%u", (unsigned int)ud->cred.gid) == -1)
|
||||
goto oom;
|
||||
if (asprintf(&user_info[++i], "egid=%u", (unsigned int)ud->cred.egid) == -1)
|
||||
if (asprintf(&info[++i], "egid=%u", (unsigned int)ud->cred.egid) == -1)
|
||||
goto oom;
|
||||
|
||||
if ((cp = get_user_groups(ud->username, &ud->cred)) == NULL)
|
||||
goto oom;
|
||||
user_info[++i] = cp;
|
||||
info[++i] = cp;
|
||||
|
||||
mask = umask(0);
|
||||
umask(mask);
|
||||
if (asprintf(&user_info[++i], "umask=0%o", (unsigned int)mask) == -1)
|
||||
if (asprintf(&info[++i], "umask=0%o", (unsigned int)mask) == -1)
|
||||
goto oom;
|
||||
|
||||
if (getcwd(path, sizeof(path)) != NULL) {
|
||||
user_info[++i] = sudo_new_key_val("cwd", path);
|
||||
if (user_info[i] == NULL)
|
||||
info[++i] = sudo_new_key_val("cwd", path);
|
||||
if (info[i] == NULL)
|
||||
goto oom;
|
||||
ud->cwd = user_info[i] + sizeof("cwd=") - 1;
|
||||
ud->cwd = info[i] + sizeof("cwd=") - 1;
|
||||
}
|
||||
|
||||
if (get_process_ttyname(path, sizeof(path)) != NULL) {
|
||||
user_info[++i] = sudo_new_key_val("tty", path);
|
||||
if (user_info[i] == NULL)
|
||||
info[++i] = sudo_new_key_val("tty", path);
|
||||
if (info[i] == NULL)
|
||||
goto oom;
|
||||
ud->tty = user_info[i] + sizeof("tty=") - 1;
|
||||
ud->tty = info[i] + sizeof("tty=") - 1;
|
||||
} else {
|
||||
/* tty may not always be present */
|
||||
if (errno != ENOENT)
|
||||
@@ -617,36 +610,36 @@ get_user_info(struct user_details *ud)
|
||||
}
|
||||
|
||||
cp = sudo_gethostname();
|
||||
user_info[++i] = sudo_new_key_val("host", cp ? cp : "localhost");
|
||||
info[++i] = sudo_new_key_val("host", cp ? cp : "localhost");
|
||||
free(cp);
|
||||
if (user_info[i] == NULL)
|
||||
if (info[i] == NULL)
|
||||
goto oom;
|
||||
ud->host = user_info[i] + sizeof("host=") - 1;
|
||||
ud->host = info[i] + sizeof("host=") - 1;
|
||||
|
||||
sudo_get_ttysize(&ud->ts_rows, &ud->ts_cols);
|
||||
if (asprintf(&user_info[++i], "lines=%d", ud->ts_rows) == -1)
|
||||
if (asprintf(&info[++i], "lines=%d", ud->ts_rows) == -1)
|
||||
goto oom;
|
||||
if (asprintf(&user_info[++i], "cols=%d", ud->ts_cols) == -1)
|
||||
if (asprintf(&info[++i], "cols=%d", ud->ts_cols) == -1)
|
||||
goto oom;
|
||||
|
||||
n = serialize_limits(&user_info[i + 1], user_info_max - (i + 1));
|
||||
n = serialize_limits(&info[i + 1], info_max - (i + 1));
|
||||
if (n == -1)
|
||||
goto oom;
|
||||
i += n;
|
||||
|
||||
user_info[++i] = NULL;
|
||||
info[++i] = NULL;
|
||||
|
||||
/* Add to list of vectors to be garbage collected at exit. */
|
||||
if (!gc_add(GC_VECTOR, user_info))
|
||||
if (!gc_add(GC_VECTOR, info))
|
||||
goto bad;
|
||||
|
||||
debug_return_ptr(user_info);
|
||||
debug_return_ptr(info);
|
||||
oom:
|
||||
sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory"));
|
||||
bad:
|
||||
while (i--)
|
||||
free(user_info[i]);
|
||||
free(user_info);
|
||||
free(info[i]);
|
||||
free(info);
|
||||
debug_return_ptr(NULL);
|
||||
}
|
||||
|
||||
@@ -1020,8 +1013,7 @@ run_command(struct command_details *details)
|
||||
* to consume. Returns a NULL-terminated plugin-style array of pairs.
|
||||
*/
|
||||
static char **
|
||||
format_plugin_settings(struct plugin_container *plugin,
|
||||
struct sudo_settings *sudo_settings)
|
||||
format_plugin_settings(struct plugin_container *plugin)
|
||||
{
|
||||
size_t plugin_settings_size;
|
||||
struct sudo_debug_file *debug_file;
|
||||
@@ -1079,8 +1071,7 @@ bad:
|
||||
}
|
||||
|
||||
static void
|
||||
policy_open(struct sudo_settings *settings, char * const user_info[],
|
||||
char * const user_env[])
|
||||
policy_open(void)
|
||||
{
|
||||
char **plugin_settings;
|
||||
const char *errstr = NULL;
|
||||
@@ -1088,7 +1079,7 @@ policy_open(struct sudo_settings *settings, char * const user_info[],
|
||||
debug_decl(policy_open, SUDO_DEBUG_PCOMM);
|
||||
|
||||
/* Convert struct sudo_settings to plugin_settings[] */
|
||||
plugin_settings = format_plugin_settings(&policy_plugin, settings);
|
||||
plugin_settings = format_plugin_settings(&policy_plugin);
|
||||
if (plugin_settings == NULL)
|
||||
sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory"));
|
||||
|
||||
@@ -1101,11 +1092,11 @@ policy_open(struct sudo_settings *settings, char * const user_info[],
|
||||
case SUDO_API_MKVERSION(1, 1):
|
||||
ok = policy_plugin.u.policy_1_0->open(policy_plugin.u.io_1_0->version,
|
||||
sudo_conversation_1_7, sudo_conversation_printf, plugin_settings,
|
||||
user_info, user_env);
|
||||
user_info, submit_envp);
|
||||
break;
|
||||
default:
|
||||
ok = policy_plugin.u.policy->open(SUDO_API_VERSION, sudo_conversation,
|
||||
sudo_conversation_printf, plugin_settings, user_info, user_env,
|
||||
sudo_conversation_printf, plugin_settings, user_info, submit_envp,
|
||||
policy_plugin.options, &errstr);
|
||||
}
|
||||
|
||||
@@ -1172,9 +1163,8 @@ policy_show_version(int verbose)
|
||||
}
|
||||
|
||||
static bool
|
||||
policy_check(int argc, char * const argv[],
|
||||
char *env_add[], char **command_info[], char **argv_out[],
|
||||
char **user_env_out[])
|
||||
policy_check(int argc, char * const argv[], char *env_add[],
|
||||
char **command_info[], char **run_argv[], char **run_envp[])
|
||||
{
|
||||
const char *errstr = NULL;
|
||||
int ok;
|
||||
@@ -1186,7 +1176,7 @@ policy_check(int argc, char * const argv[],
|
||||
}
|
||||
sudo_debug_set_active_instance(policy_plugin.debug_instance);
|
||||
ok = policy_plugin.u.policy->check_policy(argc, argv, env_add,
|
||||
command_info, argv_out, user_env_out, &errstr);
|
||||
command_info, run_argv, run_envp, &errstr);
|
||||
sudo_debug_set_active_instance(sudo_debug_instance);
|
||||
sudo_debug_printf(SUDO_DEBUG_INFO, "policy plugin returns %d (%s)",
|
||||
ok, errstr ? errstr : "");
|
||||
@@ -1211,12 +1201,11 @@ policy_check(int argc, char * const argv[],
|
||||
debug_return_bool(false);
|
||||
}
|
||||
debug_return_bool(audit_accept(policy_plugin.name, SUDO_POLICY_PLUGIN,
|
||||
*command_info, *argv_out, *user_env_out));
|
||||
*command_info, *run_argv, *run_envp));
|
||||
}
|
||||
|
||||
static void
|
||||
policy_list(int argc, char * const argv[], int verbose,
|
||||
const char *user, char * const envp[])
|
||||
policy_list(int argc, char * const argv[], int verbose, const char *user)
|
||||
{
|
||||
const char *errstr = NULL;
|
||||
/* TODO: add list_user */
|
||||
@@ -1238,7 +1227,7 @@ policy_list(int argc, char * const argv[], int verbose,
|
||||
switch (ok) {
|
||||
case 1:
|
||||
audit_accept(policy_plugin.name, SUDO_POLICY_PLUGIN,
|
||||
command_info, argv, envp);
|
||||
command_info, argv, submit_envp);
|
||||
break;
|
||||
case 0:
|
||||
audit_reject(policy_plugin.name, SUDO_POLICY_PLUGIN,
|
||||
@@ -1261,7 +1250,7 @@ policy_list(int argc, char * const argv[], int verbose,
|
||||
}
|
||||
|
||||
static void
|
||||
policy_validate(char * const argv[], char * const envp[])
|
||||
policy_validate(char * const argv[])
|
||||
{
|
||||
const char *errstr = NULL;
|
||||
char * const command_info[] = {
|
||||
@@ -1282,7 +1271,7 @@ policy_validate(char * const argv[], char * const envp[])
|
||||
switch (ok) {
|
||||
case 1:
|
||||
audit_accept(policy_plugin.name, SUDO_POLICY_PLUGIN, command_info,
|
||||
argv, envp);
|
||||
argv, submit_envp);
|
||||
break;
|
||||
case 0:
|
||||
audit_reject(policy_plugin.name, SUDO_POLICY_PLUGIN,
|
||||
@@ -1374,16 +1363,15 @@ done:
|
||||
}
|
||||
|
||||
static int
|
||||
iolog_open_int(struct plugin_container *plugin, struct sudo_settings *settings,
|
||||
char * const user_info[], char * const command_info[],
|
||||
int argc, char * const argv[], char * const user_env[], const char **errstr)
|
||||
iolog_open_int(struct plugin_container *plugin, char * const command_info[],
|
||||
int argc, char * const argv[], char * const run_envp[], const char **errstr)
|
||||
{
|
||||
char **plugin_settings;
|
||||
int ret;
|
||||
debug_decl(iolog_open_int, SUDO_DEBUG_PCOMM);
|
||||
|
||||
/* Convert struct sudo_settings to plugin_settings[] */
|
||||
plugin_settings = format_plugin_settings(plugin, settings);
|
||||
plugin_settings = format_plugin_settings(plugin);
|
||||
if (plugin_settings == NULL) {
|
||||
sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory"));
|
||||
debug_return_int(-1);
|
||||
@@ -1397,17 +1385,17 @@ iolog_open_int(struct plugin_container *plugin, struct sudo_settings *settings,
|
||||
case SUDO_API_MKVERSION(1, 0):
|
||||
ret = plugin->u.io_1_0->open(plugin->u.io_1_0->version,
|
||||
sudo_conversation_1_7, sudo_conversation_printf, plugin_settings,
|
||||
user_info, argc, argv, user_env);
|
||||
user_info, argc, argv, run_envp);
|
||||
break;
|
||||
case SUDO_API_MKVERSION(1, 1):
|
||||
ret = plugin->u.io_1_1->open(plugin->u.io_1_1->version,
|
||||
sudo_conversation_1_7, sudo_conversation_printf, plugin_settings,
|
||||
user_info, command_info, argc, argv, user_env);
|
||||
user_info, command_info, argc, argv, run_envp);
|
||||
break;
|
||||
default:
|
||||
ret = plugin->u.io->open(SUDO_API_VERSION, sudo_conversation,
|
||||
sudo_conversation_printf, plugin_settings, user_info, command_info,
|
||||
argc, argv, user_env, plugin->options, errstr);
|
||||
argc, argv, run_envp, plugin->options, errstr);
|
||||
}
|
||||
|
||||
/* Stash plugin debug instance ID if set in open() function. */
|
||||
@@ -1418,17 +1406,16 @@ iolog_open_int(struct plugin_container *plugin, struct sudo_settings *settings,
|
||||
}
|
||||
|
||||
static bool
|
||||
iolog_open(struct sudo_settings *settings, char * const user_info[],
|
||||
char * const command_info[], int argc, char * const argv[],
|
||||
char * const user_env[])
|
||||
iolog_open(char * const command_info[], int argc, char * const argv[],
|
||||
char * const run_envp[])
|
||||
{
|
||||
struct plugin_container *plugin, *next;
|
||||
const char *errstr = NULL;
|
||||
debug_decl(iolog_open, SUDO_DEBUG_PCOMM);
|
||||
|
||||
TAILQ_FOREACH_SAFE(plugin, &io_plugins, entries, next) {
|
||||
int ok = iolog_open_int(plugin, settings, user_info,
|
||||
command_info, argc, argv, user_env, &errstr);
|
||||
int ok = iolog_open_int(plugin, command_info, argc, argv, run_envp,
|
||||
&errstr);
|
||||
switch (ok) {
|
||||
case 1:
|
||||
break;
|
||||
@@ -1479,17 +1466,15 @@ iolog_close(int exit_status, int error_code)
|
||||
}
|
||||
|
||||
static void
|
||||
iolog_show_version(int verbose, struct sudo_settings *settings,
|
||||
char * const user_info[], int argc, char * const argv[],
|
||||
char * const user_env[])
|
||||
iolog_show_version(int verbose, int argc, char * const argv[],
|
||||
char * const envp[])
|
||||
{
|
||||
const char *errstr = NULL;
|
||||
struct plugin_container *plugin;
|
||||
debug_decl(iolog_show_version, SUDO_DEBUG_PCOMM);
|
||||
|
||||
TAILQ_FOREACH(plugin, &io_plugins, entries) {
|
||||
int ok = iolog_open_int(plugin, settings, user_info, NULL,
|
||||
argc, argv, user_env, &errstr);
|
||||
int ok = iolog_open_int(plugin, NULL, argc, argv, envp, &errstr);
|
||||
if (ok != -1) {
|
||||
sudo_debug_set_active_instance(plugin->debug_instance);
|
||||
if (plugin->u.io->show_version != NULL) {
|
||||
@@ -1548,16 +1533,14 @@ unlink_plugin(struct plugin_container_list *plugin_list,
|
||||
}
|
||||
|
||||
static int
|
||||
audit_open_int(struct plugin_container *plugin, struct sudo_settings *settings,
|
||||
char * const user_info[], int submit_optind, char * const submit_argv[],
|
||||
char * const submit_envp[], const char **errstr)
|
||||
audit_open_int(struct plugin_container *plugin, const char **errstr)
|
||||
{
|
||||
char **plugin_settings;
|
||||
int ret;
|
||||
debug_decl(audit_open_int, SUDO_DEBUG_PCOMM);
|
||||
|
||||
/* Convert struct sudo_settings to plugin_settings[] */
|
||||
plugin_settings = format_plugin_settings(plugin, settings);
|
||||
plugin_settings = format_plugin_settings(plugin);
|
||||
if (plugin_settings == NULL) {
|
||||
sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory"));
|
||||
debug_return_int(-1);
|
||||
@@ -1576,16 +1559,14 @@ audit_open_int(struct plugin_container *plugin, struct sudo_settings *settings,
|
||||
}
|
||||
|
||||
static void
|
||||
audit_open(struct sudo_settings *settings, char * const user_info[],
|
||||
int submit_optind, char * const submit_argv[], char * const submit_envp[])
|
||||
audit_open(void)
|
||||
{
|
||||
struct plugin_container *plugin, *next;
|
||||
const char *errstr = NULL;
|
||||
debug_decl(audit_open, SUDO_DEBUG_PCOMM);
|
||||
|
||||
TAILQ_FOREACH_SAFE(plugin, &audit_plugins, entries, next) {
|
||||
int ok = audit_open_int(plugin, settings, user_info,
|
||||
submit_optind, submit_argv, submit_envp, &errstr);
|
||||
int ok = audit_open_int(plugin, &errstr);
|
||||
switch (ok) {
|
||||
case 1:
|
||||
break;
|
||||
@@ -1778,9 +1759,7 @@ audit_error(const char *plugin_name, unsigned int plugin_type,
|
||||
}
|
||||
|
||||
static int
|
||||
approval_open_int(struct plugin_container *plugin,
|
||||
struct sudo_settings *settings, char * const user_info[],
|
||||
int submit_optind, char * const submit_argv[], char * const submit_envp[])
|
||||
approval_open_int(struct plugin_container *plugin)
|
||||
{
|
||||
char **plugin_settings;
|
||||
const char *errstr = NULL;
|
||||
@@ -1788,7 +1767,7 @@ approval_open_int(struct plugin_container *plugin,
|
||||
debug_decl(approval_open_int, SUDO_DEBUG_PCOMM);
|
||||
|
||||
/* Convert struct sudo_settings to plugin_settings[] */
|
||||
plugin_settings = format_plugin_settings(plugin, settings);
|
||||
plugin_settings = format_plugin_settings(plugin);
|
||||
if (plugin_settings == NULL)
|
||||
sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory"));
|
||||
|
||||
@@ -1821,9 +1800,7 @@ approval_open_int(struct plugin_container *plugin,
|
||||
}
|
||||
|
||||
static void
|
||||
approval_show_version(int verbose, struct sudo_settings *settings,
|
||||
char * const user_info[], int submit_optind, char * const submit_argv[],
|
||||
char * const submit_envp[])
|
||||
approval_show_version(int verbose)
|
||||
{
|
||||
struct plugin_container *plugin, *next;
|
||||
int ok;
|
||||
@@ -1836,8 +1813,7 @@ approval_show_version(int verbose, struct sudo_settings *settings,
|
||||
if (plugin->u.approval->show_version == NULL)
|
||||
continue;
|
||||
|
||||
ok = approval_open_int(plugin, settings, user_info, submit_optind,
|
||||
submit_argv, submit_envp);
|
||||
ok = approval_open_int(plugin);
|
||||
if (ok == 1) {
|
||||
/* Return value of show_version currently ignored. */
|
||||
sudo_debug_set_active_instance(plugin->debug_instance);
|
||||
@@ -1857,9 +1833,7 @@ approval_show_version(int verbose, struct sudo_settings *settings,
|
||||
* called if the policy plugin accepts the command first.
|
||||
*/
|
||||
static bool
|
||||
approval_check(struct sudo_settings *settings, char * const user_info[],
|
||||
int submit_optind, char * const submit_argv[], char * const submit_envp[],
|
||||
char * const command_info[], char * const run_argv[],
|
||||
approval_check(char * const command_info[], char * const run_argv[],
|
||||
char * const run_envp[])
|
||||
{
|
||||
struct plugin_container *plugin, *next;
|
||||
@@ -1868,14 +1842,13 @@ approval_check(struct sudo_settings *settings, char * const user_info[],
|
||||
debug_decl(approval_check, SUDO_DEBUG_PCOMM);
|
||||
|
||||
/*
|
||||
* Approval plugin us only open for the life of the check() call.
|
||||
* Approval plugin is only open for the life of the check() call.
|
||||
*/
|
||||
TAILQ_FOREACH_SAFE(plugin, &approval_plugins, entries, next) {
|
||||
if (plugin->u.approval->check == NULL)
|
||||
continue;
|
||||
|
||||
ok = approval_open_int(plugin, settings, user_info, submit_optind,
|
||||
submit_argv, submit_envp);
|
||||
ok = approval_open_int(plugin);
|
||||
if (ok != 1)
|
||||
continue;
|
||||
|
||||
|
Reference in New Issue
Block a user