| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "components/nacl/loader/nacl_listener.h" | 5 #include "components/nacl/loader/nacl_listener.h" |
| 6 | 6 |
| 7 #include <errno.h> | 7 #include <errno.h> |
| 8 #include <stdlib.h> | 8 #include <stdlib.h> |
| 9 | 9 |
| 10 #if defined(OS_POSIX) | 10 #if defined(OS_POSIX) |
| (...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 102 std::string info_string(reinterpret_cast<const char*>(info), info_size); | 102 std::string info_string(reinterpret_cast<const char*>(info), info_size); |
| 103 bool result = false; | 103 bool result = false; |
| 104 if (!g_listener->Send(new NaClProcessMsg_AttachDebugExceptionHandler( | 104 if (!g_listener->Send(new NaClProcessMsg_AttachDebugExceptionHandler( |
| 105 info_string, &result))) | 105 info_string, &result))) |
| 106 return false; | 106 return false; |
| 107 return result; | 107 return result; |
| 108 } | 108 } |
| 109 | 109 |
| 110 #endif | 110 #endif |
| 111 | 111 |
| 112 // Creates the PPAPI IPC channel between the NaCl IRT and the host |
| 113 // (browser/renderer) process, and starts to listen it on the thread where |
| 114 // the given message_loop_proxy runs. |
| 115 // Also, creates and sets the corresponding NaClDesc to the given nap with |
| 116 // the FD #. |
| 117 void SetUpIPCAdapter(IPC::ChannelHandle* handle, |
| 118 scoped_refptr<base::MessageLoopProxy> message_loop_proxy, |
| 119 struct NaClApp* nap, |
| 120 int nacl_fd) { |
| 121 scoped_refptr<NaClIPCAdapter> ipc_adapter( |
| 122 new NaClIPCAdapter(*handle, message_loop_proxy.get())); |
| 123 ipc_adapter->ConnectChannel(); |
| 124 #if defined(OS_POSIX) |
| 125 handle->socket = |
| 126 base::FileDescriptor(ipc_adapter->TakeClientFileDescriptor(), true); |
| 127 #endif |
| 128 |
| 129 // Pass a NaClDesc to the untrusted side. This will hold a ref to the |
| 130 // NaClIPCAdapter. |
| 131 NaClAppSetDesc(nap, nacl_fd, ipc_adapter->MakeNaClDesc()); |
| 132 } |
| 133 |
| 112 } // namespace | 134 } // namespace |
| 113 | 135 |
| 114 class BrowserValidationDBProxy : public NaClValidationDB { | 136 class BrowserValidationDBProxy : public NaClValidationDB { |
| 115 public: | 137 public: |
| 116 explicit BrowserValidationDBProxy(NaClListener* listener) | 138 explicit BrowserValidationDBProxy(NaClListener* listener) |
| 117 : listener_(listener) { | 139 : listener_(listener) { |
| 118 } | 140 } |
| 119 | 141 |
| 120 virtual bool QueryKnownToValidate(const std::string& signature) OVERRIDE { | 142 virtual bool QueryKnownToValidate(const std::string& signature) OVERRIDE { |
| 121 // Initialize to false so that if the Send fails to write to the return | 143 // Initialize to false so that if the Send fails to write to the return |
| (...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 242 } | 264 } |
| 243 NaClChromeMainSetUrandomFd(urandom_fd); | 265 NaClChromeMainSetUrandomFd(urandom_fd); |
| 244 #endif | 266 #endif |
| 245 | 267 |
| 246 NaClChromeMainInit(); | 268 NaClChromeMainInit(); |
| 247 struct NaClChromeMainArgs *args = NaClChromeMainArgsCreate(); | 269 struct NaClChromeMainArgs *args = NaClChromeMainArgsCreate(); |
| 248 if (args == NULL) { | 270 if (args == NULL) { |
| 249 LOG(ERROR) << "NaClChromeMainArgsCreate() failed"; | 271 LOG(ERROR) << "NaClChromeMainArgsCreate() failed"; |
| 250 return; | 272 return; |
| 251 } | 273 } |
| 274 |
| 252 struct NaClApp *nap = NaClAppCreate(); | 275 struct NaClApp *nap = NaClAppCreate(); |
| 253 if (nap == NULL) { | 276 if (nap == NULL) { |
| 254 LOG(ERROR) << "NaClAppCreate() failed"; | 277 LOG(ERROR) << "NaClAppCreate() failed"; |
| 255 return; | 278 return; |
| 256 } | 279 } |
| 257 | 280 |
| 258 if (params.enable_ipc_proxy) { | 281 if (params.enable_ipc_proxy) { |
| 259 // Create the initial PPAPI IPC channel between the NaCl IRT and the | 282 // Create the PPAPI IPC channels between the NaCl IRT and the hosts |
| 260 // browser process. The IRT uses this channel to communicate with the | 283 // (browser/renderer) processes. The IRT uses these channels to communicate |
| 261 // browser and to create additional IPC channels to renderer processes. | 284 // with the host and to initialize the IPC dispatchers. |
| 262 IPC::ChannelHandle handle = | 285 IPC::ChannelHandle browser_handle = |
| 263 IPC::Channel::GenerateVerifiedChannelID("nacl"); | 286 IPC::Channel::GenerateVerifiedChannelID("nacl"); |
| 264 scoped_refptr<NaClIPCAdapter> ipc_adapter( | 287 SetUpIPCAdapter(&browser_handle, io_thread_.message_loop_proxy(), |
| 265 new NaClIPCAdapter(handle, io_thread_.message_loop_proxy().get())); | 288 nap, NACL_CHROME_DESC_BASE); |
| 266 ipc_adapter->ConnectChannel(); | |
| 267 | 289 |
| 268 // Pass a NaClDesc to the untrusted side. This will hold a ref to the | 290 IPC::ChannelHandle renderer_handle = |
| 269 // NaClIPCAdapter. | 291 IPC::Channel::GenerateVerifiedChannelID("nacl"); |
| 270 NaClAppSetDesc(nap, NACL_CHROME_DESC_BASE, ipc_adapter->MakeNaClDesc()); | 292 SetUpIPCAdapter(&renderer_handle, io_thread_.message_loop_proxy(), |
| 271 #if defined(OS_POSIX) | 293 nap, NACL_CHROME_DESC_BASE + 1); |
| 272 handle.socket = base::FileDescriptor( | 294 |
| 273 ipc_adapter->TakeClientFileDescriptor(), true); | 295 if (!Send(new NaClProcessHostMsg_PpapiChannelsCreated( |
| 274 #endif | 296 browser_handle, renderer_handle))) |
| 275 if (!Send(new NaClProcessHostMsg_PpapiChannelCreated(handle))) | |
| 276 LOG(ERROR) << "Failed to send IPC channel handle to NaClProcessHost."; | 297 LOG(ERROR) << "Failed to send IPC channel handle to NaClProcessHost."; |
| 277 } | 298 } |
| 278 | 299 |
| 279 std::vector<nacl::FileDescriptor> handles = params.handles; | 300 std::vector<nacl::FileDescriptor> handles = params.handles; |
| 280 | 301 |
| 281 #if defined(OS_LINUX) || defined(OS_MACOSX) | 302 #if defined(OS_LINUX) || defined(OS_MACOSX) |
| 282 args->number_of_cores = number_of_cores_; | 303 args->number_of_cores = number_of_cores_; |
| 283 args->create_memory_object_func = CreateMemoryObject; | 304 args->create_memory_object_func = CreateMemoryObject; |
| 284 # if defined(OS_MACOSX) | 305 # if defined(OS_MACOSX) |
| 285 CHECK(handles.size() >= 1); | 306 CHECK(handles.size() >= 1); |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 347 #if defined(OS_LINUX) | 368 #if defined(OS_LINUX) |
| 348 if (params.enable_nonsfi_mode) { | 369 if (params.enable_nonsfi_mode) { |
| 349 nacl::nonsfi::MainStart(args->imc_bootstrap_handle); | 370 nacl::nonsfi::MainStart(args->imc_bootstrap_handle); |
| 350 NOTREACHED(); | 371 NOTREACHED(); |
| 351 return; | 372 return; |
| 352 } | 373 } |
| 353 #endif | 374 #endif |
| 354 NaClChromeMainStartApp(nap, args); | 375 NaClChromeMainStartApp(nap, args); |
| 355 NOTREACHED(); | 376 NOTREACHED(); |
| 356 } | 377 } |
| OLD | NEW |