~ chicken-core (chicken-5) 1e006b65fb72c4afbcfd0e161cca9b6e84daafc2


commit 1e006b65fb72c4afbcfd0e161cca9b6e84daafc2
Author:     Evan Hanson <evhan@foldling.org>
AuthorDate: Tue Jan 1 10:49:40 2019 +1300
Commit:     felix <felix@call-with-current-continuation.org>
CommitDate: Tue Jan 1 03:17:40 2019 +0100

    chicken-do: Avoid buffer overrun when preparing Windows command line
    
    Signed-off-by: felix <felix@call-with-current-continuation.org>

diff --git a/chicken-do.c b/chicken-do.c
index f4175229..9895d6a8 100644
--- a/chicken-do.c
+++ b/chicken-do.c
@@ -42,6 +42,10 @@
 #define MAX_TARGETS 256
 #define MAX_DEPENDS 1024
 
+#ifdef WIN32
+# define MAX_COMMAND_LEN 32767
+#endif
+
 static char *targets[ MAX_TARGETS ];
 static char *depends[ MAX_DEPENDS ];
 static struct stat tstats[ MAX_TARGETS ];
@@ -75,13 +79,18 @@ static int execute(char **argv)
 #ifdef WIN32
   static PROCESS_INFORMATION process_info;
   static STARTUPINFO startup_info;
+  static TCHAR cmdline[ MAX_COMMAND_LEN ];
+  static int len;
+
   startup_info.cb = sizeof(STARTUPINFO);
-  static TCHAR cmdline[ MAX_PATH ];
 
+  /* quote command arguments */
   while(*argv != NULL) {
-    strcat(cmdline, "\"");
-    strcat(cmdline, *(argv++));
-    strcat(cmdline, "\" ");
+    len += snprintf(cmdline + len, sizeof(cmdline) - len, "\"%s\" ", *(argv++));
+    if(len > sizeof(cmdline)) {
+      fprintf(stderr, "argument list too long\n");
+      exit(1);
+    }
   }
 
   if(!CreateProcess(NULL, cmdline, NULL, NULL, TRUE, 
Trap