Fix the environment block that is passed to the CreateProcess function.
authorArgyrios Kyrtzidis <akyrtzi@gmail.com>
Sun, 15 Jun 2008 03:54:39 +0000 (03:54 +0000)
committerArgyrios Kyrtzidis <akyrtzi@gmail.com>
Sun, 15 Jun 2008 03:54:39 +0000 (03:54 +0000)
This bug made llvm-ld unable to function with "-native" option, since the process that was used to call 'gcc' was crashing.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@52284 91177308-0d34-0410-b5e6-96231b3b80d8

lib/System/Win32/Program.inc

index 7e97c7fb4a40117a9b282601304e3a43b91d7e22..f2f101fa7b9925e1648d5452a2498a2c87bf111c 100644 (file)
@@ -154,6 +154,33 @@ Program::ExecuteAndWait(const Path& path,
 
   *p = 0;
 
+  // The pointer to the environment block for the new process.
+  char *envblock = 0;
+  
+  if (envp) {
+    // An environment block consists of a null-terminated block of
+    // null-terminated strings. Convert the array of environment variables to
+    // an environment block by concatenating them.
+
+    // First, determine the length of the environment block.
+    len = 0;
+    for (unsigned i = 0; envp[i]; i++)
+      len += strlen(envp[i]) + 1;
+
+    // Now build the environment block.
+    envblock = reinterpret_cast<char *>(_alloca(len+1));
+    p = envblock;
+
+    for (unsigned i = 0; envp[i]; i++) {
+      const char *ev = envp[i];
+      size_t len = strlen(ev) + 1;
+      memcpy(p, ev, len);
+      p += len;
+    }
+
+    *p = 0;
+  }
+
   // Create a child process.
   STARTUPINFO si;
   memset(&si, 0, sizeof(si));
@@ -200,7 +227,7 @@ Program::ExecuteAndWait(const Path& path,
   fflush(stdout);
   fflush(stderr);
   BOOL rc = CreateProcess(path.c_str(), command, NULL, NULL, FALSE, 0,
-                          envp, NULL, &si, &pi);
+                          envblock, NULL, &si, &pi);
   DWORD err = GetLastError();
 
   // Regardless of whether the process got created or not, we are done with