Revert "[fuzzer][Fuchsia] Prevent deadlock from suspending threads" (#155042)
Reverts llvm/llvm-project#154854 because it broke Clang toolchain
builders for Fuchsia:
https://luci-milo.appspot.com/ui/p/fuchsia/builders/toolchain.ci/clang-linux-x64/b8705803649235662417/overview
NOKEYCHECK=True
GitOrigin-RevId: 781a4db6b50bb660cb293d3e7e29957aeb4b02ac
diff --git a/FuzzerDriver.cpp b/FuzzerDriver.cpp
index b1dd908..ad3a65a 100644
--- a/FuzzerDriver.cpp
+++ b/FuzzerDriver.cpp
@@ -306,9 +306,6 @@
return HasErrors ? 1 : 0;
}
-// Fuchsia needs to do some book checking before starting the RssThread,
-// so it has its own implementation.
-#if !LIBFUZZER_FUCHSIA
static void RssThread(Fuzzer *F, size_t RssLimitMb) {
while (true) {
SleepSeconds(1);
@@ -324,7 +321,6 @@
std::thread T(RssThread, F, RssLimitMb);
T.detach();
}
-#endif
int RunOneTest(Fuzzer *F, const char *InputFilePath, size_t MaxLen) {
Unit U = FileToVector(InputFilePath);
diff --git a/FuzzerUtilFuchsia.cpp b/FuzzerUtilFuchsia.cpp
index 1ae8e66..7f065c7 100644
--- a/FuzzerUtilFuchsia.cpp
+++ b/FuzzerUtilFuchsia.cpp
@@ -68,9 +68,6 @@
}
void AlarmHandler(int Seconds) {
- // Signal the alarm thread started.
- ExitOnErr(_zx_object_signal(SignalHandlerEvent, 0, ZX_USER_SIGNAL_0),
- "_zx_object_signal alarm");
while (true) {
SleepSeconds(Seconds);
Fuzzer::StaticAlarmCallback();
@@ -285,7 +282,6 @@
Self, ZX_EXCEPTION_CHANNEL_DEBUGGER, &Channel.Handle),
"_zx_task_create_exception_channel");
- // Signal the crash thread started.
ExitOnErr(_zx_object_signal(SignalHandlerEvent, 0, ZX_USER_SIGNAL_0),
"_zx_object_signal");
@@ -389,49 +385,10 @@
_zx_handle_close(SignalHandlerEvent);
}
-void RssThread(Fuzzer *F, size_t RssLimitMb) {
- // Signal the rss thread started.
- //
- // We must wait for this thread to start because we could accidentally suspend
- // it while the crash handler is attempting to handle the
- // ZX_EXCP_THREAD_STARTING exception. If the crash handler is suspended by the
- // lsan machinery, then there's no way for this thread to indicate it's
- // suspended because it's blocked on waiting for the exception to be handled.
- ExitOnErr(_zx_object_signal(SignalHandlerEvent, 0, ZX_USER_SIGNAL_0),
- "_zx_object_signal rss");
- while (true) {
- SleepSeconds(1);
- size_t Peak = GetPeakRSSMb();
- if (Peak > RssLimitMb)
- F->RssLimitCallback();
- }
-}
-
} // namespace
-void StartRssThread(Fuzzer *F, size_t RssLimitMb) {
- // Set up the crash handler and wait until it is ready before proceeding.
- assert(SignalHandlerEvent == ZX_HANDLE_INVALID);
- ExitOnErr(_zx_event_create(0, &SignalHandlerEvent), "_zx_event_create");
-
- if (!RssLimitMb)
- return;
- std::thread T(RssThread, F, RssLimitMb);
- T.detach();
-
- // Wait for the rss thread to start.
- ExitOnErr(_zx_object_wait_one(SignalHandlerEvent, ZX_USER_SIGNAL_0,
- ZX_TIME_INFINITE, nullptr),
- "_zx_object_wait_one rss");
- ExitOnErr(_zx_object_signal(SignalHandlerEvent, ZX_USER_SIGNAL_0, 0),
- "_zx_object_signal rss clear");
-}
-
// Platform specific functions.
void SetSignalHandler(const FuzzingOptions &Options) {
- assert(SignalHandlerEvent != ZX_HANDLE_INVALID &&
- "This should've been setup by StartRssThread.");
-
// Make sure information from libFuzzer and the sanitizers are easy to
// reassemble. `__sanitizer_log_write` has the added benefit of ensuring the
// DSO map is always available for the symbolizer.
@@ -447,20 +404,6 @@
if (Options.HandleAlrm && Options.UnitTimeoutSec > 0) {
std::thread T(AlarmHandler, Options.UnitTimeoutSec / 2 + 1);
T.detach();
-
- // Wait for the alarm thread to start.
- //
- // We must wait for this thread to start because we could accidentally
- // suspend it while the crash handler is attempting to handle the
- // ZX_EXCP_THREAD_STARTING exception. If the crash handler is suspended by
- // the lsan machinery, then there's no way for this thread to indicate it's
- // suspended because it's blocked on waiting for the exception to be
- // handled.
- ExitOnErr(_zx_object_wait_one(SignalHandlerEvent, ZX_USER_SIGNAL_0,
- ZX_TIME_INFINITE, nullptr),
- "_zx_object_wait_one alarm");
- ExitOnErr(_zx_object_signal(SignalHandlerEvent, ZX_USER_SIGNAL_0, 0),
- "_zx_object_signal alarm clear");
}
// Options.HandleInt and Options.HandleTerm are not supported on Fuchsia
@@ -470,6 +413,9 @@
!Options.HandleFpe && !Options.HandleAbrt && !Options.HandleTrap)
return;
+ // Set up the crash handler and wait until it is ready before proceeding.
+ ExitOnErr(_zx_event_create(0, &SignalHandlerEvent), "_zx_event_create");
+
SignalHandler = std::thread(CrashHandler);
zx_status_t Status = _zx_object_wait_one(SignalHandlerEvent, ZX_USER_SIGNAL_0,
ZX_TIME_INFINITE, nullptr);