From be34f37a57a4b451090cdc6ae8fc0e7da56157ea Mon Sep 17 00:00:00 2001 From: Romain Vimont Date: Mon, 9 Feb 2026 22:19:19 +0100 Subject: [PATCH] Use proper argument serialization for Windows Replace the hacky implementation for executing simple commands on Windows with the proper serialization mechanism. PR #6663 --- app/src/adb/adb.c | 32 -------------------------------- app/src/sys/win/process.c | 22 +++++----------------- 2 files changed, 5 insertions(+), 49 deletions(-) diff --git a/app/src/adb/adb.c b/app/src/adb/adb.c index 52ed4592..e388d862 100644 --- a/app/src/adb/adb.c +++ b/app/src/adb/adb.c @@ -331,56 +331,24 @@ sc_adb_reverse_remove(struct sc_intr *intr, const char *serial, bool sc_adb_push(struct sc_intr *intr, const char *serial, const char *local, const char *remote, unsigned flags) { -#ifdef _WIN32 - // Windows will parse the string, so the paths must be quoted - // (see sys/win/command.c) - local = sc_str_quote(local); - if (!local) { - return SC_PROCESS_NONE; - } - remote = sc_str_quote(remote); - if (!remote) { - free((void *) local); - return SC_PROCESS_NONE; - } -#endif - assert(serial); const char *const argv[] = SC_ADB_COMMAND("-s", serial, "push", local, remote); sc_pid pid = sc_adb_execute(argv, flags); -#ifdef _WIN32 - free((void *) remote); - free((void *) local); -#endif - return process_check_success_intr(intr, pid, "adb push", flags); } bool sc_adb_install(struct sc_intr *intr, const char *serial, const char *local, unsigned flags) { -#ifdef _WIN32 - // Windows will parse the string, so the local name must be quoted - // (see sys/win/command.c) - local = sc_str_quote(local); - if (!local) { - return SC_PROCESS_NONE; - } -#endif - assert(serial); const char *const argv[] = SC_ADB_COMMAND("-s", serial, "install", "-r", local); sc_pid pid = sc_adb_execute(argv, flags); -#ifdef _WIN32 - free((void *) local); -#endif - return process_check_success_intr(intr, pid, "adb install", flags); } diff --git a/app/src/sys/win/process.c b/app/src/sys/win/process.c index 38197f2f..c121bef2 100644 --- a/app/src/sys/win/process.c +++ b/app/src/sys/win/process.c @@ -5,25 +5,12 @@ #include #include +#include "util/command.h" #include "util/log.h" -#include "util/strbuf.h" +#include "util/str.h" #define CMD_MAX_LEN 8192 -static bool -build_cmd(char *cmd, size_t len, const char *const argv[]) { - // Windows command-line parsing is WTF: - // - // only make it work for this very specific program - // (don't handle escaping nor quotes) - size_t ret = sc_str_join(cmd, argv, ' ', len); - if (ret >= len) { - LOGE("Command too long (%" SC_PRIsizet " chars)", len - 1); - return false; - } - return true; -} - enum sc_process_result sc_process_execute_p(const char *const argv[], HANDLE *handle, unsigned flags, HANDLE *pin, HANDLE *pout, HANDLE *perr) { @@ -138,8 +125,9 @@ sc_process_execute_p(const char *const argv[], HANDLE *handle, unsigned flags, si.lpAttributeList = lpAttributeList; } - char *cmd = malloc(CMD_MAX_LEN); - if (!cmd || !build_cmd(cmd, CMD_MAX_LEN, argv)) { + assert(argv && *argv); + char *cmd = sc_command_serialize_windows(argv); + if (!cmd) { LOG_OOM(); goto error_free_attribute_list; }