diff --git a/src/hooks.c b/src/hooks.c index 5e8a395ed..4f694cc8f 100644 --- a/src/hooks.c +++ b/src/hooks.c @@ -278,3 +278,29 @@ deregister_hook(struct sudo_hook *hook) debug_return_int(rval); } + +/* Deregister all environment handling hooks. */ +void +deregister_env_hooks(void) +{ + struct sudo_hook_list *tofree; + debug_decl(deregister_env_hooks, SUDO_DEBUG_HOOKS) + + while ((tofree = sudo_hook_setenv_list) != NULL) { + sudo_hook_setenv_list = sudo_hook_setenv_list->next; + efree(tofree); + } + while ((tofree = sudo_hook_unsetenv_list) != NULL) { + sudo_hook_unsetenv_list = sudo_hook_unsetenv_list->next; + efree(tofree); + } + while ((tofree = sudo_hook_getenv_list) != NULL) { + sudo_hook_getenv_list = sudo_hook_getenv_list->next; + efree(tofree); + } + while ((tofree = sudo_hook_putenv_list) != NULL) { + sudo_hook_putenv_list = sudo_hook_putenv_list->next; + efree(tofree); + } + debug_return; +} diff --git a/src/sudo.c b/src/sudo.c index 00cb7238b..391350579 100644 --- a/src/sudo.c +++ b/src/sudo.c @@ -287,6 +287,10 @@ main(int argc, char *argv[], char *envp[]) plugin->name); } } + /* Now that we have the command's environment, disable env hooks. */ + deregister_env_hooks(); + + /* Setup command details and run command/edit. */ command_info_to_details(command_info, &command_details); command_details.argv = argv_out; command_details.envp = user_env_out; diff --git a/src/sudo.h b/src/sudo.h index ec981132f..c72f65274 100644 --- a/src/sudo.h +++ b/src/sudo.h @@ -231,6 +231,7 @@ int process_hooks_getenv(const char *name, char **val); int process_hooks_setenv(const char *name, const char *value, int overwrite); int process_hooks_putenv(char *string); int process_hooks_unsetenv(const char *name); +void deregister_env_hooks(void); /* interfaces.c */ int get_net_ifs(char **addrinfo);