diff options
author | Fabian Meumertzheim <fabian@meumertzhe.im> | 2021-10-12 13:15:38 +0200 |
---|---|---|
committer | Fabian Meumertzheim <fabian@meumertzhe.im> | 2021-10-15 10:11:09 +0200 |
commit | 554bfe492ec8ef1658500d695b3c99a1bcd3d1f8 (patch) | |
tree | 27b4a49c403df3416a02bc35fc3933fb1e35b5e4 /driver | |
parent | 50d1f3714ce1cbc09cea0ec7fb9e190349438e48 (diff) | |
download | jazzer-api-554bfe492ec8ef1658500d695b3c99a1bcd3d1f8.tar.gz |
Replace uses of dlsym and weak symbols
Neither is directly supported on Windows, but also not required: We can
simply not add these symbols if we are linking against a sanitizer.
Diffstat (limited to 'driver')
-rw-r--r-- | driver/BUILD.bazel | 6 | ||||
-rw-r--r-- | driver/libfuzzer_driver.cpp | 22 | ||||
-rw-r--r-- | driver/sanitizer_symbols.cpp | 29 |
3 files changed, 40 insertions, 17 deletions
diff --git a/driver/BUILD.bazel b/driver/BUILD.bazel index d9501505..3a1e72c0 100644 --- a/driver/BUILD.bazel +++ b/driver/BUILD.bazel @@ -84,6 +84,12 @@ cc_17_library( cc_binary( name = "jazzer_driver", + srcs = [ + # Defines symbols otherwise defined by sanitizers to prevent linker + # errors and print JVM stack traces. + # Windows-compatible replacement for __attribute__((weak)). + "sanitizer_symbols.cpp", + ], data = [ "//agent:jazzer_agent_deploy.jar", ], diff --git a/driver/libfuzzer_driver.cpp b/driver/libfuzzer_driver.cpp index 67638350..02ef1b8e 100644 --- a/driver/libfuzzer_driver.cpp +++ b/driver/libfuzzer_driver.cpp @@ -14,8 +14,6 @@ #include "libfuzzer_driver.h" -#include <dlfcn.h> - #include <algorithm> #include <filesystem> #include <fstream> @@ -44,26 +42,16 @@ DECLARE_string(id_sync_file); // Defined in fuzz_target_runner.cpp DECLARE_string(coverage_report); +// This symbol is defined by sanitizers if linked into Jazzer or in +// sanitizer_symbols.cpp if no sanitizer is used. +extern "C" void __sanitizer_set_death_callback(void (*)()); + // We apply a patch to libFuzzer to make it call this function instead of // __sanitizer_set_death_callback to pass us the death callback. extern "C" [[maybe_unused]] void __jazzer_set_death_callback( void (*callback)()) { jazzer::AbstractLibfuzzerDriver::libfuzzer_print_crashing_input_ = callback; - void *sanitizer_set_death_callback = - dlsym(RTLD_DEFAULT, "__sanitizer_set_death_callback"); - if (sanitizer_set_death_callback != nullptr) - reinterpret_cast<void (*)(void (*)())>(sanitizer_set_death_callback)( - callback); -} - -// Suppress libFuzzer warnings about missing sanitizer methods in non-ASan -// builds. -extern "C" __attribute__((weak)) int __sanitizer_acquire_crash_state() { - return true; -} - -extern "C" __attribute__((weak)) void __sanitizer_print_stack_trace() { - jazzer::DumpJvmStackTraces(); + __sanitizer_set_death_callback(callback); } namespace { diff --git a/driver/sanitizer_symbols.cpp b/driver/sanitizer_symbols.cpp new file mode 100644 index 00000000..10255ef1 --- /dev/null +++ b/driver/sanitizer_symbols.cpp @@ -0,0 +1,29 @@ +// Copyright 2021 Code Intelligence GmbH +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Called in libfuzzer_driver.cpp. +extern "C" void __sanitizer_set_death_callback(void (*)()) {} + +// Suppress libFuzzer warnings about missing sanitizer methods in non-sanitizer +// builds. +extern "C" int __sanitizer_acquire_crash_state() { return 1; } + +namespace jazzer { +void DumpJvmStackTraces(); +} + +// Dump a JVM stack trace on timeouts. +extern "C" void __sanitizer_print_stack_trace() { + jazzer::DumpJvmStackTraces(); +} |