summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthias Braun <matze@braunis.de>2017-07-07 18:53:24 +0000
committerMatthias Braun <matze@braunis.de>2017-07-07 18:53:24 +0000
commitaf7442abd0ad9b06235eb6a7b6b926de126934d1 (patch)
tree15867e795bd8b73148ffa61fc48a6656e9a8924a
parent448dea419c6cf01e5d692b58ebc36ad5453d2d8f (diff)
downloadbcm5719-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.cpp13
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.
OpenPOWER on IntegriCloud