From: Andreas Schwab Subject: pkexec: allow --version and --help even if not setuid Don't check for setuid invocation until after parsing command line, to allow running uninstalled pkexec with --help or --version. This also helps building packages that want to check for pkexec in an emulated environment that does not support setuid invocation (eg. QEMU linux-user). Index: polkit-0.114/src/programs/pkexec.c =================================================================== --- polkit-0.114.orig/src/programs/pkexec.c 2018-04-03 20:16:17.000000000 +0200 +++ polkit-0.114/src/programs/pkexec.c 2018-04-10 02:48:03.031508016 +0200 @@ -504,27 +504,6 @@ main (int argc, char *argv[]) /* Disable remote file access from GIO. */ setenv ("GIO_USE_VFS", "local", 1); - /* check for correct invocation */ - if (geteuid () != 0) - { - g_printerr ("pkexec must be setuid root\n"); - goto out; - } - - original_user_name = g_strdup (g_get_user_name ()); - if (original_user_name == NULL) - { - g_printerr ("Error getting user name.\n"); - goto out; - } - - if ((original_cwd = g_get_current_dir ()) == NULL) - { - g_printerr ("Error getting cwd: %s\n", - g_strerror (errno)); - goto out; - } - /* First process options and find the command-line to invoke. Avoid using fancy library routines * that depend on environtment variables since we haven't cleared the environment just yet. */ @@ -580,6 +559,27 @@ main (int argc, char *argv[]) goto out; } + /* check for correct invocation */ + if (geteuid () != 0) + { + g_printerr ("pkexec must be setuid root\n"); + goto out; + } + + original_user_name = g_strdup (g_get_user_name ()); + if (original_user_name == NULL) + { + g_printerr ("Error getting user name.\n"); + goto out; + } + + if ((original_cwd = g_get_current_dir ()) == NULL) + { + g_printerr ("Error getting cwd: %s\n", + g_strerror (errno)); + goto out; + } + if (opt_user == NULL) opt_user = g_strdup ("root");