// Copyright 2015 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 "src/startup-data-util.h" #include #include #include "src/base/file-utils.h" #include "src/base/logging.h" #include "src/base/platform/platform.h" #include "src/flags.h" #include "src/utils.h" namespace v8 { namespace internal { #ifdef V8_USE_EXTERNAL_STARTUP_DATA namespace { v8::StartupData g_natives; v8::StartupData g_snapshot; void ClearStartupData(v8::StartupData* data) { data->data = nullptr; data->raw_size = 0; } void DeleteStartupData(v8::StartupData* data) { delete[] data->data; ClearStartupData(data); } void FreeStartupData() { DeleteStartupData(&g_natives); DeleteStartupData(&g_snapshot); } void Load(const char* blob_file, v8::StartupData* startup_data, void (*setter_fn)(v8::StartupData*)) { ClearStartupData(startup_data); CHECK(blob_file); FILE* file = fopen(blob_file, "rb"); if (!file) { PrintF(stderr, "Failed to open startup resource '%s'.\n", blob_file); return; } fseek(file, 0, SEEK_END); startup_data->raw_size = static_cast(ftell(file)); rewind(file); startup_data->data = new char[startup_data->raw_size]; int read_size = static_cast(fread(const_cast(startup_data->data), 1, startup_data->raw_size, file)); fclose(file); if (startup_data->raw_size == read_size) { (*setter_fn)(startup_data); } else { PrintF(stderr, "Corrupted startup resource '%s'.\n", blob_file); } } void LoadFromFiles(const char* natives_blob, const char* snapshot_blob) { Load(natives_blob, &g_natives, v8::V8::SetNativesDataBlob); Load(snapshot_blob, &g_snapshot, v8::V8::SetSnapshotDataBlob); atexit(&FreeStartupData); } } // namespace #endif // V8_USE_EXTERNAL_STARTUP_DATA void InitializeExternalStartupData(const char* directory_path) { #ifdef V8_USE_EXTERNAL_STARTUP_DATA char* natives; char* snapshot; const char* snapshot_name = "snapshot_blob.bin"; #ifdef V8_MULTI_SNAPSHOTS if (!FLAG_untrusted_code_mitigations) { snapshot_name = "snapshot_blob_trusted.bin"; } #endif LoadFromFiles( base::RelativePath(&natives, directory_path, "natives_blob.bin"), base::RelativePath(&snapshot, directory_path, snapshot_name)); free(natives); free(snapshot); #endif // V8_USE_EXTERNAL_STARTUP_DATA } void InitializeExternalStartupData(const char* natives_blob, const char* snapshot_blob) { #ifdef V8_USE_EXTERNAL_STARTUP_DATA LoadFromFiles(natives_blob, snapshot_blob); #endif // V8_USE_EXTERNAL_STARTUP_DATA } } // namespace internal } // namespace v8