Home | History | Annotate | Download | only in src
      1 // Copyright 2015 the V8 project authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "src/startup-data-util.h"
      6 
      7 #include <stdlib.h>
      8 #include <string.h>
      9 
     10 #include "src/base/file-utils.h"
     11 #include "src/base/logging.h"
     12 #include "src/base/platform/platform.h"
     13 #include "src/flags.h"
     14 #include "src/utils.h"
     15 
     16 
     17 namespace v8 {
     18 namespace internal {
     19 
     20 #ifdef V8_USE_EXTERNAL_STARTUP_DATA
     21 
     22 namespace {
     23 
     24 v8::StartupData g_natives;
     25 v8::StartupData g_snapshot;
     26 
     27 
     28 void ClearStartupData(v8::StartupData* data) {
     29   data->data = nullptr;
     30   data->raw_size = 0;
     31 }
     32 
     33 
     34 void DeleteStartupData(v8::StartupData* data) {
     35   delete[] data->data;
     36   ClearStartupData(data);
     37 }
     38 
     39 
     40 void FreeStartupData() {
     41   DeleteStartupData(&g_natives);
     42   DeleteStartupData(&g_snapshot);
     43 }
     44 
     45 
     46 void Load(const char* blob_file, v8::StartupData* startup_data,
     47           void (*setter_fn)(v8::StartupData*)) {
     48   ClearStartupData(startup_data);
     49 
     50   CHECK(blob_file);
     51 
     52   FILE* file = fopen(blob_file, "rb");
     53   if (!file) {
     54     PrintF(stderr, "Failed to open startup resource '%s'.\n", blob_file);
     55     return;
     56   }
     57 
     58   fseek(file, 0, SEEK_END);
     59   startup_data->raw_size = static_cast<int>(ftell(file));
     60   rewind(file);
     61 
     62   startup_data->data = new char[startup_data->raw_size];
     63   int read_size = static_cast<int>(fread(const_cast<char*>(startup_data->data),
     64                                          1, startup_data->raw_size, file));
     65   fclose(file);
     66 
     67   if (startup_data->raw_size == read_size) {
     68     (*setter_fn)(startup_data);
     69   } else {
     70     PrintF(stderr, "Corrupted startup resource '%s'.\n", blob_file);
     71   }
     72 }
     73 
     74 
     75 void LoadFromFiles(const char* natives_blob, const char* snapshot_blob) {
     76   Load(natives_blob, &g_natives, v8::V8::SetNativesDataBlob);
     77   Load(snapshot_blob, &g_snapshot, v8::V8::SetSnapshotDataBlob);
     78 
     79   atexit(&FreeStartupData);
     80 }
     81 
     82 }  // namespace
     83 #endif  // V8_USE_EXTERNAL_STARTUP_DATA
     84 
     85 
     86 void InitializeExternalStartupData(const char* directory_path) {
     87 #ifdef V8_USE_EXTERNAL_STARTUP_DATA
     88   char* natives;
     89   char* snapshot;
     90   const char* snapshot_name = "snapshot_blob.bin";
     91 #ifdef V8_MULTI_SNAPSHOTS
     92   if (!FLAG_untrusted_code_mitigations) {
     93     snapshot_name = "snapshot_blob_trusted.bin";
     94   }
     95 #endif
     96   LoadFromFiles(
     97       base::RelativePath(&natives, directory_path, "natives_blob.bin"),
     98       base::RelativePath(&snapshot, directory_path, snapshot_name));
     99   free(natives);
    100   free(snapshot);
    101 #endif  // V8_USE_EXTERNAL_STARTUP_DATA
    102 }
    103 
    104 
    105 void InitializeExternalStartupData(const char* natives_blob,
    106                                    const char* snapshot_blob) {
    107 #ifdef V8_USE_EXTERNAL_STARTUP_DATA
    108   LoadFromFiles(natives_blob, snapshot_blob);
    109 #endif  // V8_USE_EXTERNAL_STARTUP_DATA
    110 }
    111 
    112 }  // namespace internal
    113 }  // namespace v8
    114