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/FuzzerUtilFuchsia.cpp | |
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/FuzzerUtilFuchsia.cpp')
-rw-r--r-- | compiler-rt/lib/fuzzer/FuzzerUtilFuchsia.cpp | 13 |
1 files changed, 13 insertions, 0 deletions
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 |