mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-24 03:33:20 +01:00
Fix the environment block that is passed to the CreateProcess function.
This bug made llvm-ld unable to function with "-native" option, since the process that was used to call 'gcc' was crashing. llvm-svn: 52284
This commit is contained in:
parent
fa6e02c4dc
commit
121cf54264
@ -154,6 +154,33 @@ Program::ExecuteAndWait(const Path& path,
|
|||||||
|
|
||||||
*p = 0;
|
*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.
|
// Create a child process.
|
||||||
STARTUPINFO si;
|
STARTUPINFO si;
|
||||||
memset(&si, 0, sizeof(si));
|
memset(&si, 0, sizeof(si));
|
||||||
@ -200,7 +227,7 @@ Program::ExecuteAndWait(const Path& path,
|
|||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
fflush(stderr);
|
fflush(stderr);
|
||||||
BOOL rc = CreateProcess(path.c_str(), command, NULL, NULL, FALSE, 0,
|
BOOL rc = CreateProcess(path.c_str(), command, NULL, NULL, FALSE, 0,
|
||||||
envp, NULL, &si, &pi);
|
envblock, NULL, &si, &pi);
|
||||||
DWORD err = GetLastError();
|
DWORD err = GetLastError();
|
||||||
|
|
||||||
// Regardless of whether the process got created or not, we are done with
|
// Regardless of whether the process got created or not, we are done with
|
||||||
|
Loading…
Reference in New Issue
Block a user