• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2012 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifdef UNSAFE_BUFFERS_BUILD
6 // TODO(crbug.com/40285824): Remove this and convert code to safer constructs.
7 #pragma allow_unsafe_buffers
8 #endif
9 
10 #include "components/nacl/renderer/plugin/pnacl_resources.h"
11 
12 #include <stddef.h>
13 
14 #include <vector>
15 
16 #include "base/check.h"
17 #include "base/files/file.h"
18 #include "base/notreached.h"
19 #include "components/nacl/renderer/plugin/plugin.h"
20 #include "ppapi/c/pp_errors.h"
21 
22 namespace plugin {
23 
24 namespace {
25 
26 static const char kPnaclBaseUrl[] = "chrome://pnacl-translator/";
27 
GetFullUrl(const std::string & partial_url)28 std::string GetFullUrl(const std::string& partial_url) {
29   return std::string(kPnaclBaseUrl) + nacl::PPBNaClPrivate::GetSandboxArch() +
30          "/" + partial_url;
31 }
32 
33 }  // namespace
34 
PnaclResources(Plugin * plugin,bool use_subzero)35 PnaclResources::PnaclResources(Plugin* plugin, bool use_subzero)
36     : plugin_(plugin), use_subzero_(use_subzero) {
37   for (PnaclResourceEntry& entry : resources_) {
38     entry.file_info = kInvalidNaClFileInfo;
39   }
40 }
41 
~PnaclResources()42 PnaclResources::~PnaclResources() {
43   for (PnaclResourceEntry& entry : resources_) {
44     base::File closer(entry.file_info.handle);
45   }
46 }
47 
GetUrl(ResourceType type) const48 const std::string& PnaclResources::GetUrl(ResourceType type) const {
49   size_t index = static_cast<size_t>(type);
50   DCHECK(index < NUM_TYPES);
51   return resources_[index].tool_name;
52 }
53 
TakeFileInfo(ResourceType type)54 PP_NaClFileInfo PnaclResources::TakeFileInfo(ResourceType type) {
55   size_t index = static_cast<size_t>(type);
56   if (index >= NUM_TYPES) {
57     NOTREACHED();
58   }
59   PP_NaClFileInfo to_return = resources_[index].file_info;
60   resources_[index].file_info = kInvalidNaClFileInfo;
61   return to_return;
62 }
63 
ReadResourceInfo()64 bool PnaclResources::ReadResourceInfo() {
65   PP_Var pp_llc_tool_name_var;
66   PP_Var pp_ld_tool_name_var;
67   PP_Var pp_subzero_tool_name_var;
68   if (!nacl::PPBNaClPrivate::GetPnaclResourceInfo(
69           plugin_->pp_instance(), &pp_llc_tool_name_var, &pp_ld_tool_name_var,
70           &pp_subzero_tool_name_var)) {
71     return false;
72   }
73   pp::Var llc_tool_name(pp::PASS_REF, pp_llc_tool_name_var);
74   pp::Var ld_tool_name(pp::PASS_REF, pp_ld_tool_name_var);
75   pp::Var subzero_tool_name(pp::PASS_REF, pp_subzero_tool_name_var);
76   resources_[LLC].tool_name = GetFullUrl(llc_tool_name.AsString());
77   resources_[LD].tool_name = GetFullUrl(ld_tool_name.AsString());
78   resources_[SUBZERO].tool_name = GetFullUrl(subzero_tool_name.AsString());
79   return true;
80 }
81 
82 
StartLoad()83 bool PnaclResources::StartLoad() {
84   // Do a blocking load of each of the resources.
85   std::vector<ResourceType> to_load;
86   if (use_subzero_) {
87     to_load.push_back(SUBZERO);
88   } else {
89     to_load.push_back(LLC);
90   }
91   to_load.push_back(LD);
92   bool all_valid = true;
93   for (ResourceType t : to_load) {
94     nacl::PPBNaClPrivate::GetReadExecPnaclFd(
95         resources_[t].tool_name.c_str(), &resources_[t].file_info);
96     all_valid =
97         all_valid && resources_[t].file_info.handle != PP_kInvalidFileHandle;
98   }
99   return all_valid;
100 }
101 
102 }  // namespace plugin
103