aboutsummaryrefslogtreecommitdiff
path: root/loginutils
diff options
context:
space:
mode:
authorRon Yorston <rmy@pobox.com>2025-02-03 11:55:28 +0000
committerRon Yorston <rmy@pobox.com>2025-02-03 11:55:28 +0000
commit14ccc45d548c9dfa73594f155e920c83e2882081 (patch)
treeaf1fcbc52ba1240474f321346781144d983bdc8d /loginutils
parent820ade383860692d0b5abbba00a3e428f21b88e4 (diff)
downloadbusybox-w32-14ccc45d548c9dfa73594f155e920c83e2882081.tar.gz
busybox-w32-14ccc45d548c9dfa73594f155e920c83e2882081.tar.bz2
busybox-w32-14ccc45d548c9dfa73594f155e920c83e2882081.zip
win32: retry when command needs elevated privileges
Some installer programs have an entry in their manifest to indicate that they need elevated privileges. The shell in busybox-w32 was unable to run such programs. When a program fails to run with ERROR_ELEVATION_REQUIRED, try again using ShellExecuteEx() with the 'runas' verb to give it elevated privileges. Adds 272-288 bytes. (GitHub issue #481)
Diffstat (limited to 'loginutils')
-rw-r--r--loginutils/suw32.c18
1 files changed, 6 insertions, 12 deletions
diff --git a/loginutils/suw32.c b/loginutils/suw32.c
index b3976dcfd..77c038582 100644
--- a/loginutils/suw32.c
+++ b/loginutils/suw32.c
@@ -48,8 +48,8 @@ int suw32_main(int argc UNUSED_PARAM, char **argv)
48 char *opt_command = NULL; 48 char *opt_command = NULL;
49 char *opt_shell = NULL; 49 char *opt_shell = NULL;
50 SHELLEXECUTEINFO info; 50 SHELLEXECUTEINFO info;
51 char *bb_path, *cwd, *realcwd, *q, *args; 51 const char *bb_path;
52 DECLARE_PROC_ADDR(BOOL, ShellExecuteExA, SHELLEXECUTEINFOA *); 52 char *cwd, *realcwd, *q, *args;
53 53
54 opt = getopt32(argv, "^c:s:tNW" "\0" "s--N:N--s", &opt_command, &opt_shell); 54 opt = getopt32(argv, "^c:s:tNW" "\0" "s--N:N--s", &opt_command, &opt_shell);
55 argv += optind; 55 argv += optind;
@@ -70,19 +70,17 @@ int suw32_main(int argc UNUSED_PARAM, char **argv)
70 } 70 }
71#endif 71#endif
72 72
73 /* ShellExecuteEx() needs backslash as separator in UNC paths. */
74 if (opt_shell) { 73 if (opt_shell) {
75 bb_path = file_is_win32_exe(opt_shell); 74 bb_path = file_is_win32_exe(opt_shell);
76 if (!bb_path) 75 if (!bb_path)
77 bb_error_msg_and_die("%s: Not found", opt_shell); 76 bb_error_msg_and_die("%s: Not found", opt_shell);
78 args = NULL; 77 args = NULL;
79 } else { 78 } else {
80 bb_path = xstrdup(bb_busybox_exec_path); 79 bb_path = bb_busybox_exec_path;
81 args = xstrdup("--busybox ash"); 80 args = xstrdup("--busybox ash");
82 if (!test_mode) 81 if (!test_mode)
83 args = xappendword(args, "-t \"BusyBox ash (Admin)\""); 82 args = xappendword(args, "-t \"BusyBox ash (Admin)\"");
84 } 83 }
85 slash_to_bs(bb_path);
86 84
87 memset(&info, 0, sizeof(SHELLEXECUTEINFO)); 85 memset(&info, 0, sizeof(SHELLEXECUTEINFO));
88 info.cbSize = sizeof(SHELLEXECUTEINFO); 86 info.cbSize = sizeof(SHELLEXECUTEINFO);
@@ -137,12 +135,7 @@ int suw32_main(int argc UNUSED_PARAM, char **argv)
137 /* info.lpDirectory = NULL; */ 135 /* info.lpDirectory = NULL; */
138 info.nShow = SW_SHOWNORMAL; 136 info.nShow = SW_SHOWNORMAL;
139 137
140 if (!INIT_PROC_ADDR(shell32.dll, ShellExecuteExA)) { 138 if (!mingw_shell_execute(&info)) {
141 ret = -1;
142 goto end;
143 }
144
145 if (!ShellExecuteExA(&info)) {
146 ret = 1; 139 ret = 1;
147 goto end; 140 goto end;
148 } 141 }
@@ -159,7 +152,8 @@ int suw32_main(int argc UNUSED_PARAM, char **argv)
159 } 152 }
160 end: 153 end:
161 if (ENABLE_FEATURE_CLEAN_UP) { 154 if (ENABLE_FEATURE_CLEAN_UP) {
162 free(bb_path); 155 if (bb_path != bb_busybox_exec_path)
156 free((void *)bb_path);
163 free(cwd); 157 free(cwd);
164 free(realcwd); 158 free(realcwd);
165 free(args); 159 free(args);