diff -rNaud polkit-0.105-old/src/programs/pkexec.c polkit-0.105/src/programs/pkexec.c --- polkit-0.105-old/src/programs/pkexec.c 2012-04-24 18:05:34.000000000 +0200 +++ polkit-0.105/src/programs/pkexec.c 2016-03-04 14:35:05.369004064 +0100 @@ -76,6 +76,7 @@ " --help |\n" " --disable-internal-agent |\n" " [--user username] PROGRAM [ARGUMENTS...]\n" + " [--keep-user-env] PROGRAM [ARGUMENTS...]\n" "\n" "See the pkexec manual page for more details.\n"); } @@ -391,6 +392,7 @@ gboolean opt_show_help; gboolean opt_show_version; gboolean opt_disable_internal_agent; + gboolean opt_keep_user_env; PolkitAuthority *authority; PolkitAuthorizationResult *result; PolkitSubject *subject; @@ -417,6 +419,8 @@ "LC_ALL", "TERM", "COLORTERM", + /* option to keep $USER env Jean-Philippe Guillemin */ + "USER", /* By default we don't allow running X11 apps, as it does not work in the * general case. See @@ -478,6 +482,7 @@ opt_show_help = FALSE; opt_show_version = FALSE; opt_disable_internal_agent = FALSE; + opt_keep_user_env = FALSE; for (n = 1; n < (guint) argc; n++) { if (strcmp (argv[n], "--help") == 0) @@ -503,6 +508,11 @@ { opt_disable_internal_agent = TRUE; } + /* option to keep $USER env Jean-Philippe Guillemin */ + else if (strcmp (argv[n], "--keep-user-env") == 0) + { + opt_keep_user_env = TRUE; + } else { break; @@ -600,12 +610,16 @@ /* Nuke the environment to get a well-known and sanitized environment to avoid attacks * via e.g. the DBUS_SYSTEM_BUS_ADDRESS environment variable and similar. */ - if (clearenv () != 0) - { - g_printerr ("Error clearing environment: %s\n", g_strerror (errno)); - goto out; - } - + + /* option to keep $USER env Jean-Philippe Guillemin */ + if (opt_keep_user_env == FALSE) + { + if (clearenv () != 0) + { + g_printerr ("Error clearing environment: %s\n", g_strerror (errno)); + goto out; + } + } /* Initialize the GLib type system - this is needed to interact with the * PolicyKit daemon */ @@ -783,13 +797,19 @@ else s = g_strdup_printf ("/usr/sbin:/usr/bin:/sbin:/bin:%s/bin", pw->pw_dir); g_ptr_array_add (saved_env, s); - g_ptr_array_add (saved_env, g_strdup ("LOGNAME")); - g_ptr_array_add (saved_env, g_strdup (pw->pw_name)); - g_ptr_array_add (saved_env, g_strdup ("USER")); - g_ptr_array_add (saved_env, g_strdup (pw->pw_name)); + + /* option to keep $USER env Jean-Philippe Guillemin */ + if (opt_keep_user_env == FALSE) + { + g_ptr_array_add (saved_env, g_strdup ("USER")); + g_ptr_array_add (saved_env, g_strdup (pw->pw_name)); + + } g_ptr_array_add (saved_env, g_strdup ("HOME")); g_ptr_array_add (saved_env, g_strdup (pw->pw_dir)); - + g_ptr_array_add (saved_env, g_strdup ("LOGNAME")); + g_ptr_array_add (saved_env, g_strdup (pw->pw_name)); + s = g_strdup_printf ("%d", getuid ()); g_ptr_array_add (saved_env, g_strdup ("PKEXEC_UID")); g_ptr_array_add (saved_env, s);