diff options
Diffstat (limited to 'lib/Fuzzer/FuzzerUtilDarwin.cpp')
| -rw-r--r-- | lib/Fuzzer/FuzzerUtilDarwin.cpp | 13 | 
1 files changed, 11 insertions, 2 deletions
diff --git a/lib/Fuzzer/FuzzerUtilDarwin.cpp b/lib/Fuzzer/FuzzerUtilDarwin.cpp index 9674368c355e..2df4872a9206 100644 --- a/lib/Fuzzer/FuzzerUtilDarwin.cpp +++ b/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.  | 
