From 6bce1a112b05c7a76df281385db53a04a19b9b29 Mon Sep 17 00:00:00 2001 From: Shuanglei Tao Date: Mon, 30 Oct 2023 10:55:16 +0800 Subject: [PATCH] pty: polish args join code --- src/pty.c | 46 +++++++++++++++++----------------------------- 1 file changed, 17 insertions(+), 29 deletions(-) diff --git a/src/pty.c b/src/pty.c index bbe8e22..01e9d6b 100644 --- a/src/pty.c +++ b/src/pty.c @@ -187,35 +187,6 @@ bool conpty_init() { return true; } -// convert argv to cmdline for CreateProcessW -static WCHAR *join_args(char **argv) { - char *args = NULL; - char **ptr = argv; - for (; *ptr; ptr++) { - char *quoted = (char *) quote_arg(*ptr); - size_t arg_len = args == NULL ? 1 : strlen(args) + 1; - size_t quoted_len = strlen(quoted); - args = xrealloc(args, arg_len + quoted_len); - if (arg_len == 1) memset(args, 0, 2); - if (arg_len != 1) strcat(args, " "); - strncat(args, quoted, quoted_len); - if (quoted != *ptr) free(quoted); - } - - int len = MultiByteToWideChar(CP_UTF8, 0, args, -1, NULL, 0); - if (len <= 0) goto failed; - WCHAR *ws = (WCHAR *) xmalloc(len * sizeof(WCHAR)); - if (len != MultiByteToWideChar(CP_UTF8, 0, args, -1, ws, len)) { - free(ws); - goto failed; - } - return ws; - -failed: - if (args != NULL) free(args); - return NULL; -} - static WCHAR *to_utf16(char *str) { int len = MultiByteToWideChar(CP_UTF8, 0, str, -1, NULL, 0); if (len <= 0) return NULL; @@ -228,6 +199,23 @@ static WCHAR *to_utf16(char *str) { return wstr; } +// convert argv to cmdline for CreateProcessW +static WCHAR *join_args(char **argv) { + char args[256] = {0}; + char **ptr = argv; + for (; *ptr; ptr++) { + char *quoted = (char *) quote_arg(*ptr); + size_t arg_len = strlen(args) + 1; + size_t quoted_len = strlen(quoted); + if (arg_len == 1) memset(args, 0, 2); + if (arg_len != 1) strcat(args, " "); + strncat(args, quoted, quoted_len); + if (quoted != *ptr) free(quoted); + } + if (args[255] != '\0') args[255] = '\0'; // truncate + return to_utf16(args); +} + static bool conpty_setup(HPCON *hnd, COORD size, STARTUPINFOEXW *si_ex, char **in_name, char **out_name) { static int count = 0; char buf[256];