From ffd9f0868b6158a291ad74881e5b2fb197776bee Mon Sep 17 00:00:00 2001 From: Wirtos_new Date: Sat, 19 Jun 2021 17:55:56 +0300 Subject: [PATCH] use dynamic buffer for argv --- app/src/adb.c | 11 ++++++++--- app/src/sys/win/process.c | 35 +++++++++++++++++++++++++---------- 2 files changed, 33 insertions(+), 13 deletions(-) diff --git a/app/src/adb.c b/app/src/adb.c index be973c41..ff52685c 100644 --- a/app/src/adb.c +++ b/app/src/adb.c @@ -81,14 +81,18 @@ show_adb_installation_msg() { static void show_adb_err_msg(enum process_result err, const char *const argv[]) { - char buf[512]; + size_t n_args, len; + char *buf = NULL; + len = xargvlen(argv, &n_args) + (n_args * 3 - 1) + 1; + /* buffer large enough to store argv_to_string repr + nul terminator */ + buf = malloc(len); switch (err) { case PROCESS_ERROR_GENERIC: - argv_to_string(argv, buf, sizeof(buf)); + argv_to_string(argv, buf, len); LOGE("Failed to execute: %s", buf); break; case PROCESS_ERROR_MISSING_BINARY: - argv_to_string(argv, buf, sizeof(buf)); + argv_to_string(argv, buf, len); LOGE("Command not found: %s", buf); LOGE("(make 'adb' accessible from your PATH or define its full" "path in the ADB environment variable)"); @@ -98,6 +102,7 @@ show_adb_err_msg(enum process_result err, const char *const argv[]) { // do nothing break; } + free(buf); } process_t diff --git a/app/src/sys/win/process.c b/app/src/sys/win/process.c index f170e40d..825813e5 100644 --- a/app/src/sys/win/process.c +++ b/app/src/sys/win/process.c @@ -6,6 +6,11 @@ #include "util/log.h" #include "util/str_util.h" +#if !defined(S_ISREG) && defined(S_IFMT) && defined(S_IFREG) + #define S_ISREG(m) (((m) & S_IFMT) == S_IFREG) +#endif + + static int build_cmd(char *cmd, size_t len, const char *const argv[]) { // Windows command-line parsing is WTF: @@ -24,34 +29,44 @@ enum process_result process_execute(const char *const argv[], HANDLE *handle) { STARTUPINFOW si; PROCESS_INFORMATION pi; + wchar_t *wide = NULL; + char *cmd = NULL; + enum process_result res = PROCESS_SUCCESS; + size_t len = xargvlen(argv, NULL) + 1; memset(&si, 0, sizeof(si)); si.cb = sizeof(si); - char cmd[256]; - if (build_cmd(cmd, sizeof(cmd), argv)) { + cmd = malloc(len); + if (cmd == NULL || build_cmd(cmd, len, argv) != 0) { *handle = NULL; - return PROCESS_ERROR_GENERIC; + res = PROCESS_ERROR_GENERIC; + goto end; } - wchar_t *wide = utf8_to_wide_char(cmd); + wide = utf8_to_wide_char(cmd); if (!wide) { LOGC("Could not allocate wide char string"); - return PROCESS_ERROR_GENERIC; + res = PROCESS_ERROR_GENERIC; + goto end; } if (!CreateProcessW(NULL, wide, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) { - free(wide); *handle = NULL; if (GetLastError() == ERROR_FILE_NOT_FOUND) { - return PROCESS_ERROR_MISSING_BINARY; + res = PROCESS_ERROR_MISSING_BINARY; + } else { + res = PROCESS_ERROR_GENERIC; } - return PROCESS_ERROR_GENERIC; + goto end; } - free(wide); *handle = pi.hProcess; - return PROCESS_SUCCESS; + + end: + free(wide); + free(cmd); + return res; } bool