// Copyright 2017 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. // Tests effects of (CSP) "unsafe-eval" and "wasm-eval" callback functions. // // Note: These tests are in a separate test file because the tests dynamically // change the isolate in terms of callbacks allow_code_gen_callback and // allow_wasm_code_gen_callback. #include "src/wasm/wasm-module-builder.h" #include "src/wasm/wasm-objects-inl.h" #include "src/wasm/wasm-objects.h" #include "test/cctest/cctest.h" #include "test/common/wasm/wasm-module-runner.h" namespace v8 { namespace internal { namespace wasm { namespace { // Possible values for callback pointers. enum TestValue { kTestUsingNull, // no callback. kTestUsingFalse, // callback returning false. kTestUsingTrue, // callbacl returning true. }; constexpr int kNumTestValues = 3; const char* TestValueName[kNumTestValues] = {"null", "false", "true"}; // Defined to simplify iterating over TestValues; const TestValue AllTestValues[kNumTestValues] = { kTestUsingNull, kTestUsingFalse, kTestUsingTrue}; // This matrix holds the results of setting allow_code_gen_callback // (first index) and allow_wasm_code_gen_callback (second index) using // TestValue's. The value in the matrix is true if compilation is // allowed, and false otherwise. const bool ExpectedResults[kNumTestValues][kNumTestValues] = { {true, false, true}, {false, false, true}, {true, false, true}}; bool TrueCallback(Local, Local) { return true; } bool FalseCallback(Local, Local) { return false; } typedef bool (*CallbackFn)(Local, Local); // Defines the Callback to use for the corresponding TestValue. CallbackFn Callback[kNumTestValues] = {nullptr, FalseCallback, TrueCallback}; void BuildTrivialModule(Zone* zone, ZoneBuffer* buffer) { WasmModuleBuilder* builder = new (zone) WasmModuleBuilder(zone); builder->WriteTo(*buffer); } bool TestModule(Isolate* isolate, v8::WasmCompiledModule::CallerOwnedBuffer wire_bytes) { HandleScope scope(isolate); v8::WasmCompiledModule::CallerOwnedBuffer serialized_module(nullptr, 0); MaybeLocal module = v8::WasmCompiledModule::DeserializeOrCompile( reinterpret_cast(isolate), serialized_module, wire_bytes); return !module.IsEmpty(); } } // namespace TEST(PropertiesOfCodegenCallbacks) { v8::internal::AccountingAllocator allocator; Zone zone(&allocator, ZONE_NAME); ZoneBuffer buffer(&zone); BuildTrivialModule(&zone, &buffer); v8::WasmCompiledModule::CallerOwnedBuffer wire_bytes = {buffer.begin(), buffer.size()}; Isolate* isolate = CcTest::InitIsolateOnce(); HandleScope scope(isolate); testing::SetupIsolateForWasmModule(isolate); for (TestValue codegen : AllTestValues) { for (TestValue wasm_codegen : AllTestValues) { fprintf(stderr, "Test codegen = %s, wasm_codegen = %s\n", TestValueName[codegen], TestValueName[wasm_codegen]); isolate->set_allow_code_gen_callback(Callback[codegen]); isolate->set_allow_wasm_code_gen_callback(Callback[wasm_codegen]); bool found = TestModule(isolate, wire_bytes); bool expected = ExpectedResults[codegen][wasm_codegen]; CHECK_EQ(expected, found); CcTest::CollectAllAvailableGarbage(); } } } } // namespace wasm } // namespace internal } // namespace v8