diff options
author | Marco Vanotti <mvanotti@google.com> | 2019-10-29 15:38:51 -0700 |
---|---|---|
committer | Marco Vanotti <mvanotti@google.com> | 2019-11-21 16:56:05 -0800 |
commit | e5b603a4c32044932c3a1d26ccbc7d43fec939d5 (patch) | |
tree | 35447dd82e938463586d700c1d9abec7379a6f1f /compiler-rt/lib/fuzzer | |
parent | b2e6c2b9954ba9f9b68b8394790f6cae35aea58e (diff) | |
download | bcm5719-llvm-e5b603a4c32044932c3a1d26ccbc7d43fec939d5.tar.gz bcm5719-llvm-e5b603a4c32044932c3a1d26ccbc7d43fec939d5.zip |
[libFuzzer] don't use /dev/null for DiscardOuput in Fuchsia.
Summary:
This commit moves the `DiscardOutput` function in FuzzerIO to
FuzzerUtil, so fuchsia can have its own specialized version.
In fuchsia, accessing `/dev/null` is not supported, and there's nothing
similar to a file that discards everything that is written to it. The
way of doing something similar in fuchsia is by using `fdio_null_create`
and binding that to a file descriptor with `fdio_bind_to_fd`.
This change should fix one of the issues with the `-close_fd_mask` flag
in libfuzzer, in which closing stdout was not working due to
`fopen("/dev/null", "w")` returning `NULL`.
Reviewers: kcc, aarongreen
Subscribers: #sanitizers, llvm-commits
Tags: #sanitizers, #llvm
Differential Revision: https://reviews.llvm.org/D69593
Diffstat (limited to 'compiler-rt/lib/fuzzer')
-rw-r--r-- | compiler-rt/lib/fuzzer/FuzzerIO.h | 2 | ||||
-rw-r--r-- | compiler-rt/lib/fuzzer/FuzzerIOPosix.cpp | 8 | ||||
-rw-r--r-- | compiler-rt/lib/fuzzer/FuzzerIOWindows.cpp | 8 | ||||
-rw-r--r-- | compiler-rt/lib/fuzzer/FuzzerUtil.h | 2 | ||||
-rw-r--r-- | compiler-rt/lib/fuzzer/FuzzerUtilDarwin.cpp | 9 | ||||
-rw-r--r-- | compiler-rt/lib/fuzzer/FuzzerUtilFuchsia.cpp | 13 | ||||
-rw-r--r-- | compiler-rt/lib/fuzzer/FuzzerUtilLinux.cpp | 9 | ||||
-rw-r--r-- | compiler-rt/lib/fuzzer/FuzzerUtilWindows.cpp | 9 |
8 files changed, 42 insertions, 18 deletions
diff --git a/compiler-rt/lib/fuzzer/FuzzerIO.h b/compiler-rt/lib/fuzzer/FuzzerIO.h index fe0d7b45175..ae8dd24e373 100644 --- a/compiler-rt/lib/fuzzer/FuzzerIO.h +++ b/compiler-rt/lib/fuzzer/FuzzerIO.h @@ -94,8 +94,6 @@ int DuplicateFile(int Fd); void RemoveFile(const std::string &Path); void RenameFile(const std::string &OldPath, const std::string &NewPath); -void DiscardOutput(int Fd); - intptr_t GetHandleFromFd(int fd); void MkDir(const std::string &Path); diff --git a/compiler-rt/lib/fuzzer/FuzzerIOPosix.cpp b/compiler-rt/lib/fuzzer/FuzzerIOPosix.cpp index cfd69bbc811..fcd9b8d8b9c 100644 --- a/compiler-rt/lib/fuzzer/FuzzerIOPosix.cpp +++ b/compiler-rt/lib/fuzzer/FuzzerIOPosix.cpp @@ -124,14 +124,6 @@ void RenameFile(const std::string &OldPath, const std::string &NewPath) { rename(OldPath.c_str(), NewPath.c_str()); } -void DiscardOutput(int Fd) { - FILE* Temp = fopen("/dev/null", "w"); - if (!Temp) - return; - dup2(fileno(Temp), Fd); - fclose(Temp); -} - intptr_t GetHandleFromFd(int fd) { return static_cast<intptr_t>(fd); } diff --git a/compiler-rt/lib/fuzzer/FuzzerIOWindows.cpp b/compiler-rt/lib/fuzzer/FuzzerIOWindows.cpp index 510afebef73..56757aa09a3 100644 --- a/compiler-rt/lib/fuzzer/FuzzerIOWindows.cpp +++ b/compiler-rt/lib/fuzzer/FuzzerIOWindows.cpp @@ -223,14 +223,6 @@ void RenameFile(const std::string &OldPath, const std::string &NewPath) { rename(OldPath.c_str(), NewPath.c_str()); } -void DiscardOutput(int Fd) { - FILE* Temp = fopen("nul", "w"); - if (!Temp) - return; - _dup2(_fileno(Temp), Fd); - fclose(Temp); -} - intptr_t GetHandleFromFd(int fd) { return _get_osfhandle(fd); } diff --git a/compiler-rt/lib/fuzzer/FuzzerUtil.h b/compiler-rt/lib/fuzzer/FuzzerUtil.h index 85c5571d684..00ea6550646 100644 --- a/compiler-rt/lib/fuzzer/FuzzerUtil.h +++ b/compiler-rt/lib/fuzzer/FuzzerUtil.h @@ -79,6 +79,8 @@ inline std::pair<std::string, std::string> SplitBefore(std::string X, return std::make_pair(S.substr(0, Pos), S.substr(Pos)); } +void DiscardOutput(int Fd); + std::string DisassembleCmd(const std::string &FileName); std::string SearchRegexCmd(const std::string &Regex); diff --git a/compiler-rt/lib/fuzzer/FuzzerUtilDarwin.cpp b/compiler-rt/lib/fuzzer/FuzzerUtilDarwin.cpp index 171db23570c..d449bc248f0 100644 --- a/compiler-rt/lib/fuzzer/FuzzerUtilDarwin.cpp +++ b/compiler-rt/lib/fuzzer/FuzzerUtilDarwin.cpp @@ -17,6 +17,7 @@ #include <stdlib.h> #include <string.h> #include <sys/wait.h> +#include <unistd.h> // There is no header for this on macOS so declare here extern "C" char **environ; @@ -156,6 +157,14 @@ int ExecuteCommand(const Command &Cmd) { return ProcessStatus; } +void DiscardOutput(int Fd) { + FILE* Temp = fopen("/dev/null", "w"); + if (!Temp) + return; + dup2(fileno(Temp), Fd); + fclose(Temp); +} + } // namespace fuzzer #endif // LIBFUZZER_APPLE diff --git a/compiler-rt/lib/fuzzer/FuzzerUtilFuchsia.cpp b/compiler-rt/lib/fuzzer/FuzzerUtilFuchsia.cpp index d869c3ec235..bde9f68d62a 100644 --- a/compiler-rt/lib/fuzzer/FuzzerUtilFuchsia.cpp +++ b/compiler-rt/lib/fuzzer/FuzzerUtilFuchsia.cpp @@ -18,6 +18,7 @@ #include <cinttypes> #include <cstdint> #include <fcntl.h> +#include <lib/fdio/fdio.h> #include <lib/fdio/spawn.h> #include <string> #include <sys/select.h> @@ -529,6 +530,18 @@ const void *SearchMemory(const void *Data, size_t DataLen, const void *Patt, return memmem(Data, DataLen, Patt, PattLen); } +// In fuchsia, accessing /dev/null is not supported. There's nothing +// similar to a file that discards everything that is written to it. +// The way of doing something similar in fuchsia is by using +// fdio_null_create and binding that to a file descriptor. +void DiscardOutput(int Fd) { + fdio_t *fdio_null = fdio_null_create(); + if (fdio_null == nullptr) return; + int nullfd = fdio_bind_to_fd(fdio_null, -1, 0); + if (nullfd < 0) return; + dup2(nullfd, Fd); +} + } // namespace fuzzer #endif // LIBFUZZER_FUCHSIA diff --git a/compiler-rt/lib/fuzzer/FuzzerUtilLinux.cpp b/compiler-rt/lib/fuzzer/FuzzerUtilLinux.cpp index d5a15d19f2a..bf305b45a7e 100644 --- a/compiler-rt/lib/fuzzer/FuzzerUtilLinux.cpp +++ b/compiler-rt/lib/fuzzer/FuzzerUtilLinux.cpp @@ -15,6 +15,7 @@ #include <stdlib.h> #include <sys/types.h> #include <sys/wait.h> +#include <unistd.h> namespace fuzzer { @@ -27,6 +28,14 @@ int ExecuteCommand(const Command &Cmd) { return exit_code; } +void DiscardOutput(int Fd) { + FILE* Temp = fopen("/dev/null", "w"); + if (!Temp) + return; + dup2(fileno(Temp), Fd); + fclose(Temp); +} + } // namespace fuzzer #endif diff --git a/compiler-rt/lib/fuzzer/FuzzerUtilWindows.cpp b/compiler-rt/lib/fuzzer/FuzzerUtilWindows.cpp index ed90044c3f8..527e7dbd1cf 100644 --- a/compiler-rt/lib/fuzzer/FuzzerUtilWindows.cpp +++ b/compiler-rt/lib/fuzzer/FuzzerUtilWindows.cpp @@ -16,6 +16,7 @@ #include <chrono> #include <cstring> #include <errno.h> +#include <io.h> #include <iomanip> #include <signal.h> #include <stdio.h> @@ -190,6 +191,14 @@ std::string SearchRegexCmd(const std::string &Regex) { return "findstr /r \"" + Regex + "\""; } +void DiscardOutput(int Fd) { + FILE* Temp = fopen("nul", "w"); + if (!Temp) + return; + _dup2(_fileno(Temp), Fd); + fclose(Temp); +} + } // namespace fuzzer #endif // LIBFUZZER_WINDOWS |