]> prime8.dev >> repos - ttyd.git/commitdiff
pty: polish args join code
authorShuanglei Tao <tsl0922@gmail.com>
Mon, 30 Oct 2023 02:55:16 +0000 (10:55 +0800)
committerShuanglei Tao <tsl0922@gmail.com>
Mon, 30 Oct 2023 03:18:58 +0000 (11:18 +0800)
src/pty.c

index bbe8e22be6f429137cc27b8ed67dd7713c6fe0ae..01e9d6b93be4bd2d11e1843418cba1b2b4438c85 100644 (file)
--- a/src/pty.c
+++ b/src/pty.c
@@ -187,45 +187,33 @@ bool conpty_init() {
   return true;
 }
 
+static WCHAR *to_utf16(char *str) {
+  int len = MultiByteToWideChar(CP_UTF8, 0, str, -1, NULL, 0);
+  if (len <= 0) return NULL;
+  WCHAR *wstr = xmalloc((len + 1) * sizeof(WCHAR));
+  if (len != MultiByteToWideChar(CP_UTF8, 0, str, -1, wstr, len)) {
+    free(wstr);
+    return NULL;
+  }
+  wstr[len] = L'\0';
+  return wstr;
+}
+
 // convert argv to cmdline for CreateProcessW
 static WCHAR *join_args(char **argv) {
-  char *args = NULL;
+  char args[256] = {0};
   char **ptr = argv;
   for (; *ptr; ptr++) {
     char *quoted = (char *) quote_arg(*ptr);
-    size_t arg_len = args == NULL ? 1 : strlen(args) + 1;
+    size_t arg_len = 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;
-  WCHAR *wstr = xmalloc((len + 1) * sizeof(WCHAR));
-  if (len != MultiByteToWideChar(CP_UTF8, 0, str, -1, wstr, len)) {
-    free(wstr);
-    return NULL;
-  }
-  wstr[len] = L'\0';
-  return wstr;
+  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) {