aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKarel Zak <kzak@redhat.com>2025-11-14 09:56:03 +0100
committerKarel Zak <kzak@redhat.com>2025-11-14 09:56:03 +0100
commit376496a3d35fd5a94e9c429b00c695885539f197 (patch)
tree687d5151d7220b0f0cf69302b0f4b7566827d1a0
parent792824f65ce627be880b3f60f77f734be704a445 (diff)
parent28e91d087ed1b9e3851bb16b129a1acda9253986 (diff)
downloadutil-linux-376496a3d35fd5a94e9c429b00c695885539f197.tar.gz
Merge branch 'fix/su_lsb5_compliance' of https://github.com/cgoesche/util-linux-fork
* 'fix/su_lsb5_compliance' of https://github.com/cgoesche/util-linux-fork: tests: (su) add more options tests su: pass arguments after <user> to shell
-rw-r--r--login-utils/su-common.c4
-rw-r--r--tests/expected/su/group-primary-login1
-rw-r--r--tests/expected/su/group-primary-no-login1
-rw-r--r--tests/expected/su/group-supplemental-login1
-rw-r--r--tests/expected/su/group-supplemental-no-login1
-rw-r--r--tests/expected/su/shell-additional-args1
-rw-r--r--tests/expected/su/shell-command-option1
-rwxr-xr-xtests/ts/su/group78
-rwxr-xr-xtests/ts/su/shell35
9 files changed, 121 insertions, 2 deletions
diff --git a/login-utils/su-common.c b/login-utils/su-common.c
index 38d476a1a2..4d54eab31b 100644
--- a/login-utils/su-common.c
+++ b/login-utils/su-common.c
@@ -1036,7 +1036,7 @@ int su_main(int argc, char **argv, int mode)
su->conv.appdata_ptr = (void *) su;
while ((optc =
- getopt_long(argc, argv, "c:fg:G:lmpPTs:u:hVw:", longopts,
+ getopt_long(argc, argv, "+c:fg:G:lmpPTs:u:hVw:", longopts,
NULL)) != -1) {
err_exclusive_options(optc, longopts, excl, excl_st);
@@ -1142,7 +1142,7 @@ int su_main(int argc, char **argv, int mode)
}
FALLTHROUGH;
case SU_MODE:
- if (optind < argc)
+ if (optind < argc && *argv[optind] != '-')
su->new_user = argv[optind++];
break;
}
diff --git a/tests/expected/su/group-primary-login b/tests/expected/su/group-primary-login
new file mode 100644
index 0000000000..b4b6910249
--- /dev/null
+++ b/tests/expected/su/group-primary-login
@@ -0,0 +1 @@
+ts_grp
diff --git a/tests/expected/su/group-primary-no-login b/tests/expected/su/group-primary-no-login
new file mode 100644
index 0000000000..b4b6910249
--- /dev/null
+++ b/tests/expected/su/group-primary-no-login
@@ -0,0 +1 @@
+ts_grp
diff --git a/tests/expected/su/group-supplemental-login b/tests/expected/su/group-supplemental-login
new file mode 100644
index 0000000000..b4b6910249
--- /dev/null
+++ b/tests/expected/su/group-supplemental-login
@@ -0,0 +1 @@
+ts_grp
diff --git a/tests/expected/su/group-supplemental-no-login b/tests/expected/su/group-supplemental-no-login
new file mode 100644
index 0000000000..b4b6910249
--- /dev/null
+++ b/tests/expected/su/group-supplemental-no-login
@@ -0,0 +1 @@
+ts_grp
diff --git a/tests/expected/su/shell-additional-args b/tests/expected/su/shell-additional-args
new file mode 100644
index 0000000000..01dca2d74b
--- /dev/null
+++ b/tests/expected/su/shell-additional-args
@@ -0,0 +1 @@
+/bin/bash
diff --git a/tests/expected/su/shell-command-option b/tests/expected/su/shell-command-option
new file mode 100644
index 0000000000..01dca2d74b
--- /dev/null
+++ b/tests/expected/su/shell-command-option
@@ -0,0 +1 @@
+/bin/bash
diff --git a/tests/ts/su/group b/tests/ts/su/group
new file mode 100755
index 0000000000..9bb4b14f0a
--- /dev/null
+++ b/tests/ts/su/group
@@ -0,0 +1,78 @@
+#!/bin/bash
+
+# This file is part of util-linux.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This file is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# Copyright (C) 2025 Christian Goeschel Ndjomouo <cgoesc2@wgu.edu>
+
+TS_TOPDIR="${0%/*}/../.."
+TS_DESC="group"
+
+. "$TS_TOPDIR/functions.sh"
+ts_init "$*"
+
+ts_skip_nonroot
+ts_check_test_command "$TS_CMD_SU"
+ts_check_prog "groupadd"
+ts_check_prog "groupdel"
+ts_check_prog "getent"
+
+TS_CMD_ID="id"
+
+username="$(whoami)"
+grp_name="ts_grp"
+
+if ! groupadd --force "$grp_name"; then
+ ts_skip "could not create group '$grp_name'"
+fi
+
+# Since here '-c' comes after <user> it'll be passed to the actual shell
+# instead of being interpreted by su(1).
+ts_init_subtest "primary-no-login"
+
+"$TS_CMD_SU" --group "$grp_name" "$username" \
+ -c "$TS_CMD_ID --groups --name" 2>> "$TS_ERRLOG" \
+ | grep -o "$grp_name" \
+ | uniq >> "$TS_OUTPUT"
+
+ts_finalize_subtest
+
+ts_init_subtest "primary-login"
+"$TS_CMD_SU" --group "$grp_name" - "$username" \
+ -c "$TS_CMD_ID --groups --name" 2>> "$TS_ERRLOG" \
+ | grep -o "$grp_name" \
+ | uniq >> "$TS_OUTPUT"
+
+grep -q 'Authentication failure' "$TS_ERRLOG"
+[ "$?" -eq 0 ] && ts_skip_subtest "authentication failure"
+ts_finalize_subtest
+
+ts_init_subtest "supplemental-no-login"
+"$TS_CMD_SU" --supp-group "$grp_name" "$username" \
+ -c "$TS_CMD_ID --groups --name" 2>> "$TS_ERRLOG" \
+ | grep -o "$grp_name" \
+ | uniq >> "$TS_OUTPUT"
+ts_finalize_subtest
+
+ts_init_subtest "supplemental-login"
+"$TS_CMD_SU" --supp-group "$grp_name" - "$username" \
+ -c "$TS_CMD_ID --groups --name" 2>> "$TS_ERRLOG" \
+ | grep -o "$grp_name" \
+ | uniq >> "$TS_OUTPUT"
+
+grep -q 'Authentication failure' "$TS_ERRLOG"
+[ "$?" -eq 0 ] && ts_skip_subtest "authentication failure"
+ts_finalize_subtest
+
+groupdel "$grp_name"
+
+ts_finalize \ No newline at end of file
diff --git a/tests/ts/su/shell b/tests/ts/su/shell
new file mode 100755
index 0000000000..dc77b0b4fb
--- /dev/null
+++ b/tests/ts/su/shell
@@ -0,0 +1,35 @@
+#!/bin/bash
+
+# This file is part of util-linux.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This file is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# Copyright (C) 2025 Christian Goeschel Ndjomouo <cgoesc2@wgu.edu>
+
+TS_TOPDIR="${0%/*}/../.."
+TS_DESC="shell"
+
+. "$TS_TOPDIR/functions.sh"
+ts_init "$*"
+
+ts_skip_nonroot
+
+username="$(whoami)"
+
+ts_init_subtest "command-option"
+"$TS_CMD_SU" --shell "/bin/bash" --command "echo \$SHELL" "$username" >> "$TS_OUTPUT" 2>> "$TS_ERRLOG"
+ts_finalize_subtest
+
+ts_init_subtest "additional-args"
+"$TS_CMD_SU" --shell "/bin/bash" "$username" -c "echo \$SHELL" >> "$TS_OUTPUT" 2>> "$TS_ERRLOG"
+ts_finalize_subtest
+
+ts_finalize \ No newline at end of file