Move argv and envp setting into iolog_deserialize_info().

This commit is contained in:
Todd C. Miller
2020-11-04 05:20:08 -07:00
parent f1ded289e1
commit 2d888380a4

View File

@@ -160,6 +160,30 @@ cb_iolog_mode(const union sudo_defs_val *sd_un)
return true;
}
/*
* Make a shallow copy of a NULL-terminated argument or environment vector.
* Only the outer array is allocated, the pointers inside are copied.
* The caller is responsible for freeing the returned copy.
*/
static char **
copy_vector_shallow(char * const *vec)
{
char **copy;
size_t len;
debug_decl(copy_vector, SUDOERS_DEBUG_UTIL);
for (len = 0; vec[len] != NULL; len++)
continue;
if ((copy = reallocarray(NULL, len + 1, sizeof(char *))) != NULL) {
for (len = 0; vec[len] != NULL; len++)
copy[len] = vec[len];
copy[len] = NULL;
}
debug_return_ptr(copy);
}
static void
free_iolog_details(void)
{
@@ -226,7 +250,7 @@ bad:
*/
static int
iolog_deserialize_info(struct iolog_details *details, char * const user_info[],
char * const command_info[])
char * const command_info[], char * const argv[], char * const user_env[])
{
struct eventlog *evlog;
const char *runas_uid_str = "0", *runas_euid_str = NULL;
@@ -501,6 +525,18 @@ iolog_deserialize_info(struct iolog_details *details, char * const user_info[],
}
}
if (argv != NULL) {
evlog->argv = copy_vector_shallow(argv);
if (evlog->argv == NULL)
goto oom;
}
if (user_env != NULL) {
evlog->envp = copy_vector_shallow(user_env);
if (evlog->envp == NULL)
goto oom;
}
/*
* Lookup runas user and group, preferring effective over real uid/gid.
*/
@@ -562,30 +598,6 @@ oom:
debug_return_int(-1);
}
/*
* Make a shallow copy of a NULL-terminated argument or environment vector.
* Only the outer array is allocated, the pointers inside are copied.
* The caller is responsible for freeing the returned copy.
*/
static char **
copy_vector_shallow(char * const *vec)
{
char **copy;
size_t len;
debug_decl(copy_vector, SUDOERS_DEBUG_UTIL);
for (len = 0; vec[len] != NULL; len++)
continue;
if ((copy = reallocarray(NULL, len + 1, sizeof(char *))) != NULL) {
for (len = 0; vec[len] != NULL; len++)
copy[len] = vec[len];
copy[len] = NULL;
}
debug_return_ptr(copy);
}
static int
sudoers_io_open_local(struct timespec *now)
{
@@ -733,23 +745,10 @@ sudoers_io_open(unsigned int version, sudo_conv_t conversation,
/*
* Pull iolog settings out of command_info.
*/
ret = iolog_deserialize_info(&iolog_details, user_info, command_info);
ret = iolog_deserialize_info(&iolog_details, user_info, command_info,
argv, user_env);
if (ret != true)
goto done;
if (argv != NULL) {
iolog_details.evlog->argv = copy_vector_shallow(argv);
if (iolog_details.evlog->argv == NULL) {
ret = -1;
goto done;
}
}
if (user_env != NULL) {
iolog_details.evlog->envp = copy_vector_shallow(user_env);
if (iolog_details.evlog->envp == NULL) {
ret = -1;
goto done;
}
}
/* Initialize io_operations. */
sudoers_io_setops();