diff options
author | Matthias Braun <matze@braunis.de> | 2017-07-07 18:53:24 +0000 |
---|---|---|
committer | Matthias Braun <matze@braunis.de> | 2017-07-07 18:53:24 +0000 |
commit | af7442abd0ad9b06235eb6a7b6b926de126934d1 (patch) | |
tree | 15867e795bd8b73148ffa61fc48a6656e9a8924a | |
parent | 448dea419c6cf01e5d692b58ebc36ad5453d2d8f (diff) | |
download | bcm5719-llvm-af7442abd0ad9b06235eb6a7b6b926de126934d1.tar.gz bcm5719-llvm-af7442abd0ad9b06235eb6a7b6b926de126934d1.zip |
FuzzerUtilDarwin.cpp: We need to pass modifiable strings to posix_spawn
This fixes a bug where unmodifiable strings where passed to posix_spawn.
This is an attempt to unbreak the greendragon libFuzzer bot.
llvm-svn: 307424
-rw-r--r-- | llvm/lib/Fuzzer/FuzzerUtilDarwin.cpp | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/llvm/lib/Fuzzer/FuzzerUtilDarwin.cpp b/llvm/lib/Fuzzer/FuzzerUtilDarwin.cpp index 9674368c355..2df4872a920 100644 --- a/llvm/lib/Fuzzer/FuzzerUtilDarwin.cpp +++ b/llvm/lib/Fuzzer/FuzzerUtilDarwin.cpp @@ -15,6 +15,8 @@ #include <mutex> #include <signal.h> #include <spawn.h> +#include <stdlib.h> +#include <string.h> #include <sys/wait.h> // There is no header for this on macOS so declare here @@ -97,11 +99,16 @@ int ExecuteCommand(const std::string &Command) { pid_t Pid; char **Environ = environ; // Read from global const char *CommandCStr = Command.c_str(); - const char *Argv[] = {"sh", "-c", CommandCStr, NULL}; + char *const Argv[] = { + strdup("sh"), + strdup("-c"), + strdup(CommandCStr), + NULL + }; int ErrorCode = 0, ProcessStatus = 0; // FIXME: We probably shouldn't hardcode the shell path. ErrorCode = posix_spawn(&Pid, "/bin/sh", NULL, &SpawnAttributes, - (char *const *)Argv, Environ); + Argv, Environ); (void)posix_spawnattr_destroy(&SpawnAttributes); if (!ErrorCode) { pid_t SavedPid = Pid; @@ -120,6 +127,8 @@ int ExecuteCommand(const std::string &Command) { // Shell execution failure. ProcessStatus = W_EXITCODE(127, 0); } + for (unsigned i = 0, n = sizeof(Argv) / sizeof(Argv[0]); i < n; ++i) + free(Argv[i]); // Restore the signal handlers of the current process when the last thread // using this function finishes. |