diff options
Diffstat (limited to 'miscutils/drop.c')
-rw-r--r-- | miscutils/drop.c | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/miscutils/drop.c b/miscutils/drop.c index 6effc1831..db3d709d1 100644 --- a/miscutils/drop.c +++ b/miscutils/drop.c | |||
@@ -58,6 +58,18 @@ | |||
58 | #include <lazyload.h> | 58 | #include <lazyload.h> |
59 | #include "NUM_APPLETS.h" | 59 | #include "NUM_APPLETS.h" |
60 | 60 | ||
61 | // Set an environment variable to the name of the unprivileged user, | ||
62 | // but only if it was previously unset or contained "root". | ||
63 | static void setenv_name(const char *key) | ||
64 | { | ||
65 | const char *name = get_user_name(); | ||
66 | const char *oldname = getenv(key); | ||
67 | |||
68 | if (name && (!oldname || strcmp(oldname, "root") == 0)) { | ||
69 | setenv(key, name, 1); | ||
70 | } | ||
71 | } | ||
72 | |||
61 | int drop_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; | 73 | int drop_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; |
62 | int drop_main(int argc, char **argv) | 74 | int drop_main(int argc, char **argv) |
63 | { | 75 | { |
@@ -166,6 +178,10 @@ int drop_main(int argc, char **argv) | |||
166 | si.hStdError = GetStdHandle(STD_ERROR_HANDLE); | 178 | si.hStdError = GetStdHandle(STD_ERROR_HANDLE); |
167 | si.dwFlags = STARTF_USESTDHANDLES; | 179 | si.dwFlags = STARTF_USESTDHANDLES; |
168 | 180 | ||
181 | setenv_name("USER"); | ||
182 | setenv_name("USERNAME"); | ||
183 | setenv_name("LOGNAME"); | ||
184 | |||
169 | if (!CreateProcessAsUserA(token, exe, cmd, NULL, NULL, TRUE, | 185 | if (!CreateProcessAsUserA(token, exe, cmd, NULL, NULL, TRUE, |
170 | 0, NULL, NULL, &si, &pi)) { | 186 | 0, NULL, NULL, &si, &pi)) { |
171 | xfunc_error_retval = 126; | 187 | xfunc_error_retval = 126; |