For sudoedit, run the editor with the user's original environment
as per the documentation (and as in sudo 1.7.x). Bug #688
This commit is contained in:
@@ -101,8 +101,8 @@
|
|||||||
#define KEPT_MAX 0xff00
|
#define KEPT_MAX 0xff00
|
||||||
|
|
||||||
struct environment {
|
struct environment {
|
||||||
char * const *old_envp; /* pointer the environment we passed back */
|
|
||||||
char **envp; /* pointer to the new environment */
|
char **envp; /* pointer to the new environment */
|
||||||
|
char **old_envp; /* pointer the old environment we allocated */
|
||||||
size_t env_size; /* size of new_environ in char **'s */
|
size_t env_size; /* size of new_environ in char **'s */
|
||||||
size_t env_len; /* number of slots used, not counting NULL */
|
size_t env_len; /* number of slots used, not counting NULL */
|
||||||
};
|
};
|
||||||
@@ -219,10 +219,14 @@ env_init(char * const envp[])
|
|||||||
debug_decl(env_init, SUDOERS_DEBUG_ENV)
|
debug_decl(env_init, SUDOERS_DEBUG_ENV)
|
||||||
|
|
||||||
if (envp == NULL) {
|
if (envp == NULL) {
|
||||||
|
/* Free the old envp we allocated, if any. */
|
||||||
|
sudo_efree(env.old_envp);
|
||||||
|
|
||||||
/* Reset to initial state but keep a pointer to what we allocated. */
|
/* Reset to initial state but keep a pointer to what we allocated. */
|
||||||
envp = env.envp;
|
env.old_envp = env.envp;
|
||||||
memset(&env, 0, sizeof(env));
|
env.envp = NULL;
|
||||||
env.old_envp = envp;
|
env.env_size = 0;
|
||||||
|
env.env_len = 0;
|
||||||
} else {
|
} else {
|
||||||
/* Make private copy of envp. */
|
/* Make private copy of envp. */
|
||||||
for (ep = envp; *ep != NULL; ep++)
|
for (ep = envp; *ep != NULL; ep++)
|
||||||
@@ -239,8 +243,8 @@ env_init(char * const envp[])
|
|||||||
env.envp[len] = NULL;
|
env.envp[len] = NULL;
|
||||||
|
|
||||||
/* Free the old envp we allocated, if any. */
|
/* Free the old envp we allocated, if any. */
|
||||||
if (env.old_envp != NULL)
|
sudo_efree(env.old_envp);
|
||||||
sudo_efree((void *)env.old_envp);
|
env.old_envp = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
debug_return;
|
debug_return;
|
||||||
@@ -255,6 +259,22 @@ env_get(void)
|
|||||||
return env.envp;
|
return env.envp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Swap the old and new copies of the environment.
|
||||||
|
*/
|
||||||
|
bool
|
||||||
|
env_swap_old(void)
|
||||||
|
{
|
||||||
|
char **old_envp;
|
||||||
|
|
||||||
|
if (env.old_envp == NULL)
|
||||||
|
return false;
|
||||||
|
old_envp = env.old_envp;
|
||||||
|
env.old_envp = env.envp;
|
||||||
|
env.envp = old_envp;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Similar to putenv(3) but operates on sudo's private copy of the
|
* Similar to putenv(3) but operates on sudo's private copy of the
|
||||||
* environment (not environ) and it always overwrites. The dupcheck param
|
* environment (not environ) and it always overwrites. The dupcheck param
|
||||||
@@ -810,7 +830,7 @@ env_update_didvar(const char *ep, unsigned int *didvar)
|
|||||||
bool
|
bool
|
||||||
rebuild_env(void)
|
rebuild_env(void)
|
||||||
{
|
{
|
||||||
char **old_envp, **ep, *cp, *ps1;
|
char **ep, *cp, *ps1;
|
||||||
char idbuf[MAX_UID_T_LEN + 1];
|
char idbuf[MAX_UID_T_LEN + 1];
|
||||||
unsigned int didvar;
|
unsigned int didvar;
|
||||||
bool reset_home = false;
|
bool reset_home = false;
|
||||||
@@ -823,7 +843,8 @@ rebuild_env(void)
|
|||||||
didvar = 0;
|
didvar = 0;
|
||||||
env.env_len = 0;
|
env.env_len = 0;
|
||||||
env.env_size = 128;
|
env.env_size = 128;
|
||||||
old_envp = env.envp;
|
sudo_efree(env.old_envp);
|
||||||
|
env.old_envp = env.envp;
|
||||||
env.envp = sudo_emallocarray(env.env_size, sizeof(char *));
|
env.envp = sudo_emallocarray(env.env_size, sizeof(char *));
|
||||||
#ifdef ENV_DEBUG
|
#ifdef ENV_DEBUG
|
||||||
memset(env.envp, 0, env.env_size * sizeof(char *));
|
memset(env.envp, 0, env.env_size * sizeof(char *));
|
||||||
@@ -867,7 +888,7 @@ rebuild_env(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Pull in vars we want to keep from the old environment. */
|
/* Pull in vars we want to keep from the old environment. */
|
||||||
for (ep = old_envp; *ep; ep++) {
|
for (ep = env.old_envp; *ep; ep++) {
|
||||||
bool keepit;
|
bool keepit;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -943,7 +964,7 @@ rebuild_env(void)
|
|||||||
* Copy environ entries as long as they don't match env_delete or
|
* Copy environ entries as long as they don't match env_delete or
|
||||||
* env_check.
|
* env_check.
|
||||||
*/
|
*/
|
||||||
for (ep = old_envp; *ep; ep++) {
|
for (ep = env.old_envp; *ep; ep++) {
|
||||||
/* Add variable unless it matches a black list. */
|
/* Add variable unless it matches a black list. */
|
||||||
if (!env_should_delete(*ep)) {
|
if (!env_should_delete(*ep)) {
|
||||||
if (strncmp(*ep, "SUDO_PS1=", 9) == 0)
|
if (strncmp(*ep, "SUDO_PS1=", 9) == 0)
|
||||||
@@ -970,7 +991,7 @@ rebuild_env(void)
|
|||||||
* they have already been set) or sudoedit (because we want the editor
|
* they have already been set) or sudoedit (because we want the editor
|
||||||
* to find the invoking user's startup files).
|
* to find the invoking user's startup files).
|
||||||
*/
|
*/
|
||||||
if (def_set_logname && !ISSET(sudo_mode, MODE_LOGIN_SHELL|MODE_EDIT)) {
|
if (def_set_logname && !ISSET(sudo_mode, MODE_LOGIN_SHELL)) {
|
||||||
if (!ISSET(didvar, KEPT_LOGNAME))
|
if (!ISSET(didvar, KEPT_LOGNAME))
|
||||||
sudo_setenv2("LOGNAME", runas_pw->pw_name, true, true);
|
sudo_setenv2("LOGNAME", runas_pw->pw_name, true, true);
|
||||||
if (!ISSET(didvar, KEPT_USER))
|
if (!ISSET(didvar, KEPT_USER))
|
||||||
@@ -1021,9 +1042,6 @@ rebuild_env(void)
|
|||||||
if (sudo_setenv2("SUDO_GID", idbuf, true, true) == -1)
|
if (sudo_setenv2("SUDO_GID", idbuf, true, true) == -1)
|
||||||
goto bad;
|
goto bad;
|
||||||
|
|
||||||
/* Free old environment. */
|
|
||||||
sudo_efree(old_envp);
|
|
||||||
|
|
||||||
debug_return_bool(true);
|
debug_return_bool(true);
|
||||||
|
|
||||||
bad:
|
bad:
|
||||||
|
@@ -525,6 +525,9 @@ sudoers_policy_main(int argc, char * const argv[], int pwflag, char *env_add[],
|
|||||||
safe_cmnd = find_editor(NewArgc - 1, NewArgv + 1, &edit_argc, &edit_argv);
|
safe_cmnd = find_editor(NewArgc - 1, NewArgv + 1, &edit_argc, &edit_argv);
|
||||||
if (safe_cmnd == NULL || audit_success(edit_argc, edit_argv) != 0)
|
if (safe_cmnd == NULL || audit_success(edit_argc, edit_argv) != 0)
|
||||||
goto bad;
|
goto bad;
|
||||||
|
|
||||||
|
/* We want to run the editor with the unmodified environment. */
|
||||||
|
env_swap_old();
|
||||||
} else {
|
} else {
|
||||||
if (audit_success(NewArgc, NewArgv) != 0)
|
if (audit_success(NewArgc, NewArgv) != 0)
|
||||||
goto bad;
|
goto bad;
|
||||||
|
@@ -324,6 +324,7 @@ char *expand_iolog_path(const char *prefix, const char *dir, const char *file,
|
|||||||
/* env.c */
|
/* env.c */
|
||||||
char **env_get(void);
|
char **env_get(void);
|
||||||
bool env_merge(char * const envp[]);
|
bool env_merge(char * const envp[]);
|
||||||
|
bool env_swap_old(void);
|
||||||
void env_init(char * const envp[]);
|
void env_init(char * const envp[]);
|
||||||
void init_envtables(void);
|
void init_envtables(void);
|
||||||
bool insert_env_vars(char * const envp[]);
|
bool insert_env_vars(char * const envp[]);
|
||||||
|
Reference in New Issue
Block a user