2016-01-26 10:38:37 +00:00
|
|
|
// Copyright 2016 the V8 project authors. All rights reserved.
|
|
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
|
|
// found in the LICENSE file.
|
|
|
|
|
|
|
|
#include "test/fuzzer/fuzzer-support.h"
|
|
|
|
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include <string.h>
|
|
|
|
|
|
|
|
#include "include/libplatform/libplatform.h"
|
|
|
|
#include "include/v8-context.h"
|
|
|
|
#include "include/v8-initialization.h"
|
2016-04-28 13:32:17 +00:00
|
|
|
#include "src/flags/flags.h"
|
2020-09-01 10:37:26 +00:00
|
|
|
#include "src/trap-handler/trap-handler.h"
|
2016-04-28 13:32:17 +00:00
|
|
|
|
2016-01-26 10:38:37 +00:00
|
|
|
namespace v8_fuzzer {
|
|
|
|
|
|
|
|
FuzzerSupport::FuzzerSupport(int* argc, char*** argv) {
|
2022-09-14 15:18:48 +00:00
|
|
|
// Disable hard abort, which generates a trap instead of a proper abortion.
|
|
|
|
// Traps by default do not cause libfuzzer to generate a crash file.
|
2022-10-13 14:17:31 +00:00
|
|
|
i::v8_flags.hard_abort = false;
|
2022-09-14 15:18:48 +00:00
|
|
|
|
2022-10-13 14:17:31 +00:00
|
|
|
i::v8_flags.expose_gc = true;
|
2022-06-15 10:38:52 +00:00
|
|
|
|
|
|
|
// Allow changing flags in fuzzers.
|
|
|
|
// TODO(12887): Refactor fuzzers to not change flags after initialization.
|
2022-10-13 14:17:31 +00:00
|
|
|
i::v8_flags.freeze_flags_after_init = false;
|
2022-06-15 10:38:52 +00:00
|
|
|
|
2022-09-14 15:18:48 +00:00
|
|
|
#if V8_ENABLE_WEBASSEMBLY
|
|
|
|
if (V8_TRAP_HANDLER_SUPPORTED) {
|
|
|
|
constexpr bool kUseDefaultTrapHandler = true;
|
|
|
|
if (!v8::V8::EnableWebAssemblyTrapHandler(kUseDefaultTrapHandler)) {
|
|
|
|
FATAL("Could not register trap handler");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
#endif // V8_ENABLE_WEBASSEMBLY
|
|
|
|
|
2016-01-26 10:38:37 +00:00
|
|
|
v8::V8::SetFlagsFromCommandLine(argc, *argv, true);
|
2016-06-08 12:09:25 +00:00
|
|
|
v8::V8::InitializeICUDefaultLocation((*argv)[0]);
|
2016-01-26 10:38:37 +00:00
|
|
|
v8::V8::InitializeExternalStartupData((*argv)[0]);
|
2017-11-13 13:16:49 +00:00
|
|
|
platform_ = v8::platform::NewDefaultPlatform();
|
|
|
|
v8::V8::InitializePlatform(platform_.get());
|
2016-01-26 10:38:37 +00:00
|
|
|
v8::V8::Initialize();
|
|
|
|
|
2016-06-29 07:39:45 +00:00
|
|
|
allocator_ = v8::ArrayBuffer::Allocator::NewDefaultAllocator();
|
2016-01-26 10:38:37 +00:00
|
|
|
v8::Isolate::CreateParams create_params;
|
|
|
|
create_params.array_buffer_allocator = allocator_;
|
2021-07-26 11:16:47 +00:00
|
|
|
create_params.allow_atomics_wait = false;
|
2016-01-26 10:38:37 +00:00
|
|
|
isolate_ = v8::Isolate::New(create_params);
|
|
|
|
|
|
|
|
{
|
|
|
|
v8::Isolate::Scope isolate_scope(isolate_);
|
|
|
|
v8::HandleScope handle_scope(isolate_);
|
|
|
|
context_.Reset(isolate_, v8::Context::New(isolate_));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
FuzzerSupport::~FuzzerSupport() {
|
|
|
|
{
|
|
|
|
v8::Isolate::Scope isolate_scope(isolate_);
|
2017-09-04 10:05:10 +00:00
|
|
|
while (PumpMessageLoop()) {
|
|
|
|
// empty
|
|
|
|
}
|
2016-01-26 10:38:37 +00:00
|
|
|
|
|
|
|
v8::HandleScope handle_scope(isolate_);
|
|
|
|
context_.Reset();
|
|
|
|
}
|
|
|
|
|
2016-05-06 12:52:19 +00:00
|
|
|
isolate_->LowMemoryNotification();
|
2016-01-26 10:38:37 +00:00
|
|
|
isolate_->Dispose();
|
|
|
|
isolate_ = nullptr;
|
|
|
|
|
|
|
|
delete allocator_;
|
|
|
|
allocator_ = nullptr;
|
|
|
|
|
|
|
|
v8::V8::Dispose();
|
2021-11-30 13:38:10 +00:00
|
|
|
v8::V8::DisposePlatform();
|
2016-01-26 10:38:37 +00:00
|
|
|
}
|
|
|
|
|
2017-11-28 10:48:12 +00:00
|
|
|
std::unique_ptr<FuzzerSupport> FuzzerSupport::fuzzer_support_;
|
|
|
|
|
2016-01-26 10:38:37 +00:00
|
|
|
// static
|
2017-11-28 10:48:12 +00:00
|
|
|
void FuzzerSupport::InitializeFuzzerSupport(int* argc, char*** argv) {
|
|
|
|
DCHECK_NULL(FuzzerSupport::fuzzer_support_);
|
|
|
|
FuzzerSupport::fuzzer_support_ =
|
2019-09-10 10:12:00 +00:00
|
|
|
std::make_unique<v8_fuzzer::FuzzerSupport>(argc, argv);
|
2017-11-28 10:48:12 +00:00
|
|
|
}
|
2016-01-26 10:38:37 +00:00
|
|
|
|
2017-11-28 10:48:12 +00:00
|
|
|
// static
|
|
|
|
FuzzerSupport* FuzzerSupport::Get() {
|
|
|
|
DCHECK_NOT_NULL(FuzzerSupport::fuzzer_support_);
|
|
|
|
return FuzzerSupport::fuzzer_support_.get();
|
|
|
|
}
|
2016-01-26 10:38:37 +00:00
|
|
|
|
|
|
|
v8::Local<v8::Context> FuzzerSupport::GetContext() {
|
|
|
|
v8::Isolate::Scope isolate_scope(isolate_);
|
|
|
|
v8::EscapableHandleScope handle_scope(isolate_);
|
|
|
|
v8::Local<v8::Context> context =
|
|
|
|
v8::Local<v8::Context>::New(isolate_, context_);
|
|
|
|
return handle_scope.Escape(context);
|
|
|
|
}
|
|
|
|
|
2017-06-13 14:41:54 +00:00
|
|
|
bool FuzzerSupport::PumpMessageLoop(
|
|
|
|
v8::platform::MessageLoopBehavior behavior) {
|
2017-11-13 13:16:49 +00:00
|
|
|
return v8::platform::PumpMessageLoop(platform_.get(), isolate_, behavior);
|
2017-06-13 14:41:54 +00:00
|
|
|
}
|
|
|
|
|
2016-01-26 10:38:37 +00:00
|
|
|
} // namespace v8_fuzzer
|
|
|
|
|
2017-12-19 19:06:00 +00:00
|
|
|
// Explicitly specify some attributes to avoid issues with the linker dead-
|
|
|
|
// stripping the following function on macOS, as it is not called directly
|
|
|
|
// by fuzz target. LibFuzzer runtime uses dlsym() to resolve that function.
|
2022-02-17 10:40:49 +00:00
|
|
|
#if V8_OS_DARWIN
|
2017-12-19 19:06:00 +00:00
|
|
|
__attribute__((used)) __attribute__((visibility("default")))
|
2022-02-17 10:40:49 +00:00
|
|
|
#endif // V8_OS_DARWIN
|
2017-12-19 19:06:00 +00:00
|
|
|
extern "C" int
|
|
|
|
LLVMFuzzerInitialize(int* argc, char*** argv) {
|
2017-11-28 10:48:12 +00:00
|
|
|
v8_fuzzer::FuzzerSupport::InitializeFuzzerSupport(argc, argv);
|
2016-01-26 10:38:37 +00:00
|
|
|
return 0;
|
|
|
|
}
|