From d877e3fcac949867d031250a696d203a061394ea Mon Sep 17 00:00:00 2001 From: Harm te Hennepe Date: Tue, 27 Mar 2018 00:45:03 +0200 Subject: [PATCH] su.c: be more predictable Always parse first non-option as username. --- man/su.1.xml | 41 ++++++++++++++++++++--------------------- src/su.c | 13 ++++--------- 2 files changed, 24 insertions(+), 30 deletions(-) diff --git a/man/su.1.xml b/man/su.1.xml index 24143c38..4b413fc8 100644 --- a/man/su.1.xml +++ b/man/su.1.xml @@ -85,12 +85,16 @@ su - options + options - - username - + - + + + username + + args + @@ -98,26 +102,21 @@ DESCRIPTION - The su command is used to become another user during - a login session. Invoked without a , - su defaults to - becoming the superuser. The optional argument may - be used to provide an environment similar to what the user would - expect had the user logged in directly. - - - - Additional arguments may be provided after the username, in which case - they are supplied to the user's login shell. In particular, an - argument of will cause the next argument to be - treated as a command by most command interpreters. The command will be - executed by the shell specified in /etc/passwd - for the target user. + The su command is used to become another user during a + login session. Invoked without a , + su defaults to becoming the superuser. The + option may be used to provide an environment similar + to what the user would expect had the user logged in directly. The + option may be used to treat the next argument as a + command by most shells. - You can use the argument to separate - su options from the arguments supplied to the shell. + Options are recognized everywhere in the argument list. You can use the + argument to stop option parsing. The + option is special: it is also recognized after + , but has to be placed before + . The user will be prompted for a password, if appropriate. Invalid diff --git a/src/su.c b/src/su.c index 974048e9..8a5371f7 100644 --- a/src/su.c +++ b/src/su.c @@ -436,7 +436,7 @@ static void prepare_pam_close_session (void) static void usage (int status) { (void) - fputs (_("Usage: su [options] [LOGIN]\n" + fputs (_("Usage: su [options] [-] [username [args]]\n" "\n" "Options:\n" " -c, --command COMMAND pass COMMAND to the invoked shell\n" @@ -446,7 +446,8 @@ static void usage (int status) " --preserve-environment do not reset environment variables, and\n" " keep the same shell\n" " -s, --shell SHELL use SHELL instead of the default in passwd\n" - "\n"), (E_SUCCESS != status) ? stderr : stdout); + "\n" + "If no username is given, assume root.\n"), (E_SUCCESS != status) ? stderr : stdout); exit (status); } @@ -815,13 +816,7 @@ static void process_flags (int argc, char **argv) } } - /* - * The next argument must be either a user ID, or some flag to a - * subshell. Pretty sticky since you can't have an argument which - * doesn't start with a "-" unless you specify the new user name. - * Any remaining arguments will be passed to the user's login shell. - */ - if ((optind < argc) && ('-' != argv[optind][0])) { + if (optind < argc) { STRFCPY (name, argv[optind++]); /* use this login id */ if ((optind < argc) && (strcmp (argv[optind], "--") == 0)) { optind++; -- 2.40.0