struct eventlog: rename argv/env to runargv/runenv.
This matches the JSON logs.
This commit is contained in:
@@ -110,9 +110,9 @@ struct eventlog {
|
||||
char *submituser;
|
||||
char *submitgroup;
|
||||
char *ttyname;
|
||||
char **argv;
|
||||
char **runargv;
|
||||
char **runenv;
|
||||
char **env_add;
|
||||
char **envp;
|
||||
struct timespec submit_time;
|
||||
struct timespec iolog_offset;
|
||||
struct timespec run_time;
|
||||
|
@@ -191,24 +191,24 @@ new_logline(int event_type, int flags, struct eventlog_args *args,
|
||||
}
|
||||
sudo_lbuf_append(lbuf, " ; ");
|
||||
}
|
||||
if (evlog->command != NULL && evlog->argv != NULL) {
|
||||
if (evlog->command != NULL && evlog->runargv != NULL) {
|
||||
/* Command plus argv. */
|
||||
sudo_lbuf_append_esc(lbuf, LBUF_ESC_CNTRL|LBUF_ESC_BLANK,
|
||||
"COMMAND=%s", evlog->command);
|
||||
if (evlog->argv[0] != NULL) {
|
||||
for (i = 1; evlog->argv[i] != NULL; i++) {
|
||||
if (evlog->runargv[0] != NULL) {
|
||||
for (i = 1; evlog->runargv[i] != NULL; i++) {
|
||||
sudo_lbuf_append(lbuf, " ");
|
||||
if (strchr(evlog->argv[i], ' ') != NULL) {
|
||||
if (strchr(evlog->runargv[i], ' ') != NULL) {
|
||||
/* Wrap args containing spaces in single quotes. */
|
||||
sudo_lbuf_append(lbuf, "'");
|
||||
sudo_lbuf_append_esc(lbuf, LBUF_ESC_CNTRL|LBUF_ESC_QUOTE,
|
||||
"%s", evlog->argv[i]);
|
||||
"%s", evlog->runargv[i]);
|
||||
sudo_lbuf_append(lbuf, "'");
|
||||
} else {
|
||||
/* Escape quotes here too for consistency. */
|
||||
sudo_lbuf_append_esc(lbuf,
|
||||
LBUF_ESC_CNTRL|LBUF_ESC_BLANK|LBUF_ESC_QUOTE,
|
||||
"%s", evlog->argv[i]);
|
||||
"%s", evlog->runargv[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -733,10 +733,10 @@ eventlog_store_json(struct json_container *jsonc, const struct eventlog *evlog)
|
||||
if (!sudo_json_add_value(jsonc, "lines", &json_value))
|
||||
goto oom;
|
||||
|
||||
if (evlog->argv != NULL) {
|
||||
if (evlog->runargv != NULL) {
|
||||
if (!sudo_json_open_array(jsonc, "runargv"))
|
||||
goto oom;
|
||||
for (i = 0; (cp = evlog->argv[i]) != NULL; i++) {
|
||||
for (i = 0; (cp = evlog->runargv[i]) != NULL; i++) {
|
||||
json_value.type = JSON_STRING;
|
||||
json_value.u.string = cp;
|
||||
if (!sudo_json_add_value(jsonc, NULL, &json_value))
|
||||
@@ -746,10 +746,10 @@ eventlog_store_json(struct json_container *jsonc, const struct eventlog *evlog)
|
||||
goto oom;
|
||||
}
|
||||
|
||||
if (evlog->envp != NULL) {
|
||||
if (evlog->runenv != NULL) {
|
||||
if (!sudo_json_open_array(jsonc, "runenv"))
|
||||
goto oom;
|
||||
for (i = 0; (cp = evlog->envp[i]) != NULL; i++) {
|
||||
for (i = 0; (cp = evlog->runenv[i]) != NULL; i++) {
|
||||
json_value.type = JSON_STRING;
|
||||
json_value.u.string = cp;
|
||||
if (!sudo_json_add_value(jsonc, NULL, &json_value))
|
||||
|
@@ -59,15 +59,15 @@ eventlog_free(struct eventlog *evlog)
|
||||
free(evlog->submituser);
|
||||
free(evlog->submitgroup);
|
||||
free(evlog->ttyname);
|
||||
if (evlog->argv != NULL) {
|
||||
for (i = 0; evlog->argv[i] != NULL; i++)
|
||||
free(evlog->argv[i]);
|
||||
free(evlog->argv);
|
||||
if (evlog->runargv != NULL) {
|
||||
for (i = 0; evlog->runargv[i] != NULL; i++)
|
||||
free(evlog->runargv[i]);
|
||||
free(evlog->runargv);
|
||||
}
|
||||
if (evlog->envp != NULL) {
|
||||
for (i = 0; evlog->envp[i] != NULL; i++)
|
||||
free(evlog->envp[i]);
|
||||
free(evlog->envp);
|
||||
if (evlog->runenv != NULL) {
|
||||
for (i = 0; evlog->runenv[i] != NULL; i++)
|
||||
free(evlog->runenv[i]);
|
||||
free(evlog->runenv);
|
||||
}
|
||||
if (evlog->env_add != NULL) {
|
||||
for (i = 0; evlog->env_add[i] != NULL; i++)
|
||||
|
@@ -201,14 +201,14 @@ json_store_runargv(struct json_item *item, struct eventlog *evlog)
|
||||
size_t i;
|
||||
debug_decl(json_store_runargv, SUDO_DEBUG_UTIL);
|
||||
|
||||
if (evlog->argv != NULL) {
|
||||
for (i = 0; evlog->argv[i] != NULL; i++)
|
||||
free(evlog->argv[i]);
|
||||
free(evlog->argv);
|
||||
if (evlog->runargv != NULL) {
|
||||
for (i = 0; evlog->runargv[i] != NULL; i++)
|
||||
free(evlog->runargv[i]);
|
||||
free(evlog->runargv);
|
||||
}
|
||||
evlog->argv = json_array_to_strvec(&item->u.child);
|
||||
evlog->runargv = json_array_to_strvec(&item->u.child);
|
||||
|
||||
debug_return_bool(evlog->argv != NULL);
|
||||
debug_return_bool(evlog->runargv != NULL);
|
||||
}
|
||||
|
||||
static bool
|
||||
@@ -217,14 +217,14 @@ json_store_runenv(struct json_item *item, struct eventlog *evlog)
|
||||
size_t i;
|
||||
debug_decl(json_store_runenv, SUDO_DEBUG_UTIL);
|
||||
|
||||
if (evlog->envp != NULL) {
|
||||
for (i = 0; evlog->envp[i] != NULL; i++)
|
||||
free(evlog->envp[i]);
|
||||
free(evlog->envp);
|
||||
if (evlog->runenv != NULL) {
|
||||
for (i = 0; evlog->runenv[i] != NULL; i++)
|
||||
free(evlog->runenv[i]);
|
||||
free(evlog->runenv);
|
||||
}
|
||||
evlog->envp = json_array_to_strvec(&item->u.child);
|
||||
evlog->runenv = json_array_to_strvec(&item->u.child);
|
||||
|
||||
debug_return_bool(evlog->envp != NULL);
|
||||
debug_return_bool(evlog->runenv != NULL);
|
||||
}
|
||||
|
||||
static bool
|
||||
|
@@ -131,7 +131,7 @@ iolog_write_info_file_legacy(int dfd, struct eventlog *evlog)
|
||||
evlog->lines, evlog->columns,
|
||||
evlog->cwd ? evlog->cwd : "unknown");
|
||||
fputs(evlog->command ? evlog->command : "unknown", fp);
|
||||
for (av = evlog->argv + 1; *av != NULL; av++) {
|
||||
for (av = evlog->runargv + 1; *av != NULL; av++) {
|
||||
fputc(' ', fp);
|
||||
fputs(*av, fp);
|
||||
}
|
||||
|
@@ -205,8 +205,8 @@ evlog_new(TimeSpec *submit_time, InfoMessage **info_msgs, size_t infolen,
|
||||
case 'r':
|
||||
if (strcmp(key, "runargv") == 0) {
|
||||
if (type_matches(info, source, INFO_MESSAGE__VALUE_STRLISTVAL)) {
|
||||
evlog->argv = strlist_copy(info->u.strlistval);
|
||||
if (evlog->argv == NULL)
|
||||
evlog->runargv = strlist_copy(info->u.strlistval);
|
||||
if (evlog->runargv == NULL)
|
||||
goto bad;
|
||||
}
|
||||
continue;
|
||||
@@ -233,8 +233,8 @@ evlog_new(TimeSpec *submit_time, InfoMessage **info_msgs, size_t infolen,
|
||||
}
|
||||
if (strcmp(key, "runenv") == 0) {
|
||||
if (type_matches(info, source, INFO_MESSAGE__VALUE_STRLISTVAL)) {
|
||||
evlog->envp = strlist_copy(info->u.strlistval);
|
||||
if (evlog->envp == NULL)
|
||||
evlog->runenv = strlist_copy(info->u.strlistval);
|
||||
if (evlog->runenv == NULL)
|
||||
goto bad;
|
||||
}
|
||||
continue;
|
||||
|
@@ -507,9 +507,9 @@ fmt_runargv(const struct eventlog *evlog)
|
||||
debug_decl(fmt_runargv, SUDO_DEBUG_UTIL);
|
||||
|
||||
/* We may have runargv from the log.json file. */
|
||||
if (evlog->argv != NULL && evlog->argv[0] != NULL) {
|
||||
/* Convert evlog->argv into a StringList. */
|
||||
runargv = vec_to_stringlist(evlog->argv);
|
||||
if (evlog->runargv != NULL && evlog->runargv[0] != NULL) {
|
||||
/* Convert evlog->runargv into a StringList. */
|
||||
runargv = vec_to_stringlist(evlog->runargv);
|
||||
if (runargv != NULL) {
|
||||
/* Make sure command doesn't include arguments. */
|
||||
char *cp = strchr(evlog->command, ' ');
|
||||
@@ -533,10 +533,10 @@ fmt_runenv(const struct eventlog *evlog)
|
||||
debug_decl(fmt_runenv, SUDO_DEBUG_UTIL);
|
||||
|
||||
/* Only present in log.json. */
|
||||
if (evlog->envp == NULL || evlog->envp[0] == NULL)
|
||||
if (evlog->runenv == NULL || evlog->runenv[0] == NULL)
|
||||
debug_return_ptr(NULL);
|
||||
|
||||
debug_return_ptr(vec_to_stringlist(evlog->envp));
|
||||
debug_return_ptr(vec_to_stringlist(evlog->runenv));
|
||||
}
|
||||
|
||||
static InfoMessage **
|
||||
|
@@ -197,10 +197,10 @@ free_iolog_details(void)
|
||||
|
||||
if (iolog_details.evlog != NULL) {
|
||||
/* We only make a shallow copy of argv and envp. */
|
||||
free(iolog_details.evlog->argv);
|
||||
iolog_details.evlog->argv = NULL;
|
||||
free(iolog_details.evlog->envp);
|
||||
iolog_details.evlog->envp = NULL;
|
||||
free(iolog_details.evlog->runargv);
|
||||
iolog_details.evlog->runargv = NULL;
|
||||
free(iolog_details.evlog->runenv);
|
||||
iolog_details.evlog->runenv = NULL;
|
||||
eventlog_free(iolog_details.evlog);
|
||||
}
|
||||
str_list_free(iolog_details.log_servers);
|
||||
@@ -601,13 +601,13 @@ iolog_deserialize_info(struct log_details *details, char * const user_info[],
|
||||
}
|
||||
|
||||
if (argv != NULL) {
|
||||
evlog->argv = copy_vector_shallow(argv);
|
||||
if (evlog->argv == NULL)
|
||||
evlog->runargv = copy_vector_shallow(argv);
|
||||
if (evlog->runargv == NULL)
|
||||
goto oom;
|
||||
}
|
||||
if (user_env != NULL) {
|
||||
evlog->envp = copy_vector_shallow(user_env);
|
||||
if (evlog->envp == NULL)
|
||||
evlog->runenv = copy_vector_shallow(user_env);
|
||||
if (evlog->runenv == NULL)
|
||||
goto oom;
|
||||
}
|
||||
|
||||
|
@@ -823,20 +823,20 @@ fmt_info_messages(struct client_closure *closure, struct eventlog *evlog,
|
||||
debug_decl(fmt_info_messages, SUDOERS_DEBUG_UTIL);
|
||||
|
||||
/* Convert NULL-terminated vectors to StringList. */
|
||||
if (evlog->argv != NULL) {
|
||||
if (evlog->runargv != NULL) {
|
||||
if ((runargv = malloc(sizeof(*runargv))) == NULL)
|
||||
goto bad;
|
||||
info_message__string_list__init(runargv);
|
||||
runargv->strings = evlog->argv;
|
||||
runargv->strings = evlog->runargv;
|
||||
while (runargv->strings[runargv->n_strings] != NULL)
|
||||
runargv->n_strings++;
|
||||
}
|
||||
|
||||
if (evlog->envp != NULL) {
|
||||
if (evlog->runenv != NULL) {
|
||||
if ((runenv = malloc(sizeof(*runenv))) == NULL)
|
||||
goto bad;
|
||||
info_message__string_list__init(runenv);
|
||||
runenv->strings = evlog->envp;
|
||||
runenv->strings = evlog->runenv;
|
||||
while (runenv->strings[runenv->n_strings] != NULL)
|
||||
runenv->n_strings++;
|
||||
}
|
||||
|
@@ -1001,9 +1001,9 @@ sudoers_to_eventlog(const struct sudoers_context *ctx, struct eventlog *evlog,
|
||||
if (grp != NULL)
|
||||
evlog->submitgroup = grp->gr_name;
|
||||
evlog->ttyname = ctx->user.ttypath;
|
||||
evlog->argv = (char **)argv;
|
||||
evlog->runargv = (char **)argv;
|
||||
evlog->env_add = (char **)ctx->user.env_add;
|
||||
evlog->envp = (char **)envp;
|
||||
evlog->runenv = (char **)envp;
|
||||
evlog->submit_time = ctx->submit_time;
|
||||
evlog->lines = ctx->user.lines;
|
||||
evlog->columns = ctx->user.cols;
|
||||
|
@@ -989,7 +989,8 @@ init_vars(struct sudoers_context *ctx, char * const envp[])
|
||||
#define MATCHES(s, v) \
|
||||
(strncmp((s), (v), sizeof(v) - 1) == 0 && (s)[sizeof(v) - 1] != '\0')
|
||||
|
||||
for (ep = envp; *ep; ep++) {
|
||||
ctx->user.envp = envp;
|
||||
for (ep = ctx->user.envp; *ep; ep++) {
|
||||
switch (**ep) {
|
||||
case 'K':
|
||||
if (MATCHES(*ep, "KRB5CCNAME="))
|
||||
|
@@ -131,6 +131,7 @@ struct sudoers_user_context {
|
||||
char *cmnd_list;
|
||||
char *ccname;
|
||||
struct gid_list *gid_list;
|
||||
char * const * envp;
|
||||
char * const * env_add;
|
||||
int closefrom;
|
||||
int lines;
|
||||
|
@@ -366,9 +366,9 @@ main(int argc, char *argv[])
|
||||
if ((evlog = iolog_parse_loginfo(iolog_dir_fd, iolog_dir)) == NULL)
|
||||
goto done;
|
||||
printf(_("Replaying sudo session: %s"), evlog->command);
|
||||
if (evlog->argv != NULL && evlog->argv[0] != NULL) {
|
||||
for (i = 1; evlog->argv[i] != NULL; i++)
|
||||
printf(" %s", evlog->argv[i]);
|
||||
if (evlog->runargv != NULL && evlog->runargv[0] != NULL) {
|
||||
for (i = 1; evlog->runargv[i] != NULL; i++)
|
||||
printf(" %s", evlog->runargv[i]);
|
||||
}
|
||||
|
||||
/* Setup terminal if appropriate. */
|
||||
@@ -1321,15 +1321,15 @@ expand_command(struct eventlog *evlog, char **newbuf)
|
||||
int ac;
|
||||
debug_decl(expand_command, SUDO_DEBUG_UTIL);
|
||||
|
||||
if (evlog->argv == NULL || evlog->argv[0] == NULL || evlog->argv[1] == NULL) {
|
||||
if (evlog->runargv == NULL || evlog->runargv[0] == NULL || evlog->runargv[1] == NULL) {
|
||||
/* No arguments, we can use the command as-is. */
|
||||
*newbuf = NULL;
|
||||
debug_return_str(evlog->command);
|
||||
}
|
||||
|
||||
/* Skip argv[0], we use evlog->command instead. */
|
||||
for (ac = 1; evlog->argv[ac] != NULL; ac++)
|
||||
bufsize += strlen(evlog->argv[ac]) + 1;
|
||||
for (ac = 1; evlog->runargv[ac] != NULL; ac++)
|
||||
bufsize += strlen(evlog->runargv[ac]) + 1;
|
||||
|
||||
if ((buf = malloc(bufsize)) == NULL)
|
||||
sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory"));
|
||||
@@ -1341,13 +1341,13 @@ expand_command(struct eventlog *evlog, char **newbuf)
|
||||
cp += len;
|
||||
bufsize -= len;
|
||||
|
||||
for (ac = 1; evlog->argv[ac] != NULL; ac++) {
|
||||
for (ac = 1; evlog->runargv[ac] != NULL; ac++) {
|
||||
if (bufsize < 2)
|
||||
sudo_fatalx(U_("internal error, %s overflow"), __func__);
|
||||
*cp++ = ' ';
|
||||
bufsize--;
|
||||
|
||||
len = strlcpy(cp, evlog->argv[ac], bufsize);
|
||||
len = strlcpy(cp, evlog->runargv[ac], bufsize);
|
||||
if (len >= bufsize)
|
||||
sudo_fatalx(U_("internal error, %s overflow"), __func__);
|
||||
cp += len;
|
||||
|
Reference in New Issue
Block a user