Merge pull request #34771 from ZLima12/run0-root-working-directory

run: fix bug causing run0 to ignore `-D /`.
This commit is contained in:
Yu Watanabe
2024-10-15 20:43:47 +09:00
committed by GitHub
3 changed files with 19 additions and 1 deletions
+6 -1
View File
@@ -862,7 +862,8 @@ static int parse_argv_sudo_mode(int argc, char *argv[]) {
break;
case 'D':
r = parse_path_argument(optarg, true, &arg_working_directory);
/* Root will be manually suppressed later. */
r = parse_path_argument(optarg, /* suppress_root= */ false, &arg_working_directory);
if (r < 0)
return r;
@@ -901,6 +902,10 @@ static int parse_argv_sudo_mode(int argc, char *argv[]) {
if (r < 0)
return log_error_errno(r, "Failed to get current working directory: %m");
}
} else {
/* Root was not suppressed earlier, to allow the above check to work properly. */
if (empty_or_root(arg_working_directory))
arg_working_directory = mfree(arg_working_directory);
}
arg_service_type = "exec";
+1
View File
@@ -211,6 +211,7 @@ BASICTOOLS=(
ping
pkill
ps
pwd
readlink
realpath
rev
+12
View File
@@ -246,4 +246,16 @@ if [[ -e /usr/lib/pam.d/systemd-run0 ]] || [[ -e /etc/pam.d/systemd-run0 ]]; the
# Let's chain a couple of run0 calls together, for fun
readarray -t cmdline < <(printf "%.0srun0\n" {0..31})
assert_eq "$("${cmdline[@]}" bash -c 'echo $SUDO_USER')" "$USER"
# Tests for working directory, especially for specifying "/" (see PR #34771).
cd /
assert_eq "$(run0 pwd)" "/"
assert_eq "$(run0 -D /tmp pwd)" "/tmp"
assert_eq "$(run0 --user=testuser pwd)" "/home/testuser"
assert_eq "$(run0 -D /tmp --user=testuser pwd)" "/tmp"
cd /tmp
assert_eq "$(run0 pwd)" "/tmp"
assert_eq "$(run0 -D / pwd)" "/"
assert_eq "$(run0 --user=testuser pwd)" "/home/testuser"
assert_eq "$(run0 -D / --user=testuser pwd)" "/"
fi