diff --git a/src/sudo/env/environment.rs b/src/sudo/env/environment.rs index 3eaf74546..0bb914e36 100644 --- a/src/sudo/env/environment.rs +++ b/src/sudo/env/environment.rs @@ -62,6 +62,7 @@ fn add_extra_env( context.current_user.gid.to_string().into(), ); environment.insert("SUDO_USER".into(), context.current_user.name.clone().into()); + environment.insert("SUDO_HOME".into(), context.current_user.home.clone().into()); // target user environment .entry("MAIL".into()) diff --git a/src/sudo/env/tests.rs b/src/sudo/env/tests.rs index 8ab782881..6ba9003b3 100644 --- a/src/sudo/env/tests.rs +++ b/src/sudo/env/tests.rs @@ -35,6 +35,7 @@ const TESTS: &str = " SUDO_GID=1000 SUDO_UID=1000 SUDO_USER=test + SUDO_HOME=/home/test HOME=/root LOGNAME=root USER=root @@ -52,6 +53,7 @@ const TESTS: &str = " SUDO_GID=1000 SUDO_UID=1000 SUDO_USER=test + SUDO_HOME=/home/test HOME=/home/test LOGNAME=test USER=test diff --git a/test-framework/sudo-compliance-tests/src/sudo/env_reset.rs b/test-framework/sudo-compliance-tests/src/sudo/env_reset.rs index 2926e51c3..a57581f41 100644 --- a/test-framework/sudo-compliance-tests/src/sudo/env_reset.rs +++ b/test-framework/sudo-compliance-tests/src/sudo/env_reset.rs @@ -173,6 +173,7 @@ fn some_vars_are_preserved() { let term = "some-term"; let sudo_command = "some-sudo-command"; let sudo_user = "some-sudo-user"; + let sudo_home = "some-sudo-home"; let sudo_uid = "some-sudo-uid"; let sudo_gid = "some-sudo-gid"; let stdout = Command::new("env") @@ -189,6 +190,7 @@ fn some_vars_are_preserved() { &format!("TERM={term}"), &format!("SUDO_COMMAND={sudo_command}"), &format!("SUDO_USER={sudo_user}"), + &format!("SUDO_HOME={sudo_home}"), &format!("SUDO_UID={sudo_uid}"), &format!("SUDO_GID={sudo_gid}"), &sudo_abs_path, diff --git a/test-framework/sudo-compliance-tests/src/sudo/sudoers/env.rs b/test-framework/sudo-compliance-tests/src/sudo/sudoers/env.rs index ba26b8ea4..37c5d4ac4 100644 --- a/test-framework/sudo-compliance-tests/src/sudo/sudoers/env.rs +++ b/test-framework/sudo-compliance-tests/src/sudo/sudoers/env.rs @@ -311,7 +311,7 @@ fn vars_with_target_user_specific_values(env_list: EnvList) { fn sudo_env_vars(env_list: EnvList) { let env = Env([ SUDOERS_ALL_ALL_NOPASSWD, - &format!("Defaults {env_list} = \"SUDO_COMMAND SUDO_GID SUDO_UID SUDO_USER\""), + &format!("Defaults {env_list} = \"SUDO_COMMAND SUDO_GID SUDO_UID SUDO_USER SUDO_HOME\""), ]) .build(); @@ -320,6 +320,7 @@ fn sudo_env_vars(env_list: EnvList) { .arg("SUDO_GID=gid") .arg("SUDO_UID=uid") .arg("SUDO_USER=user") + .arg("SUDO_HOME=sudo_home") .args(["sudo", "env"]) .output(&env) .stdout(); @@ -329,6 +330,10 @@ fn sudo_env_vars(env_list: EnvList) { assert_eq!(Some("0"), sudo_env.get("SUDO_GID").copied()); assert_eq!(Some("0"), sudo_env.get("SUDO_UID").copied()); assert_eq!(Some("root"), sudo_env.get("SUDO_USER").copied()); + + if let Some(val) = sudo_env.get("SUDO_HOME").copied() { + assert_eq!("/root", val); + } } fn user_set_to_preserved_logname_value(env_list: EnvList) {