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 <fcntl.h> | 8 #include <fcntl.h> |
9 #include <stdlib.h> | 9 #include <stdlib.h> |
10 #include <string.h> | 10 #include <string.h> |
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
140 // (browser/renderer) process, and starts to listen it on the thread where | 140 // (browser/renderer) process, and starts to listen it on the thread where |
141 // the given message_loop_proxy runs. | 141 // the given message_loop_proxy runs. |
142 // Also, creates and sets the corresponding NaClDesc to the given nap with | 142 // Also, creates and sets the corresponding NaClDesc to the given nap with |
143 // the FD #. | 143 // the FD #. |
144 void SetUpIPCAdapter( | 144 void SetUpIPCAdapter( |
145 IPC::ChannelHandle* handle, | 145 IPC::ChannelHandle* handle, |
146 scoped_refptr<base::SingleThreadTaskRunner> task_runner, | 146 scoped_refptr<base::SingleThreadTaskRunner> task_runner, |
147 struct NaClApp* nap, | 147 struct NaClApp* nap, |
148 int nacl_fd, | 148 int nacl_fd, |
149 NaClIPCAdapter::ResolveFileTokenCallback resolve_file_token_cb, | 149 NaClIPCAdapter::ResolveFileTokenCallback resolve_file_token_cb, |
150 NaClIPCAdapter::OpenResourceCallback open_resource_cb) { | 150 NaClIPCAdapter::OpenResourceCallback open_resource_cb, |
151 scoped_refptr<NaClIPCAdapter> ipc_adapter(new NaClIPCAdapter( | 151 IPC::AttachmentBroker* broker) { |
152 *handle, task_runner.get(), resolve_file_token_cb, open_resource_cb)); | 152 scoped_refptr<NaClIPCAdapter> ipc_adapter( |
| 153 new NaClIPCAdapter(*handle, task_runner.get(), resolve_file_token_cb, |
| 154 open_resource_cb, broker)); |
153 ipc_adapter->ConnectChannel(); | 155 ipc_adapter->ConnectChannel(); |
154 #if defined(OS_POSIX) | 156 #if defined(OS_POSIX) |
155 handle->socket = | 157 handle->socket = |
156 base::FileDescriptor(ipc_adapter->TakeClientFileDescriptor()); | 158 base::FileDescriptor(ipc_adapter->TakeClientFileDescriptor()); |
157 #endif | 159 #endif |
158 | 160 |
159 // Pass a NaClDesc to the untrusted side. This will hold a ref to the | 161 // Pass a NaClDesc to the untrusted side. This will hold a ref to the |
160 // NaClIPCAdapter. | 162 // NaClIPCAdapter. |
161 NaClAppSetDesc(nap, nacl_fd, ipc_adapter->MakeNaClDesc()); | 163 NaClAppSetDesc(nap, nacl_fd, ipc_adapter->MakeNaClDesc()); |
162 } | 164 } |
(...skipping 24 matching lines...) Expand all Loading... |
187 if (!listener_->Send(new NaClProcessMsg_SetKnownToValidate(signature))) { | 189 if (!listener_->Send(new NaClProcessMsg_SetKnownToValidate(signature))) { |
188 LOG(ERROR) << "Failed to update NaCl validation cache."; | 190 LOG(ERROR) << "Failed to update NaCl validation cache."; |
189 } | 191 } |
190 } | 192 } |
191 | 193 |
192 private: | 194 private: |
193 // The listener never dies, otherwise this might be a dangling reference. | 195 // The listener never dies, otherwise this might be a dangling reference. |
194 NaClListener* listener_; | 196 NaClListener* listener_; |
195 }; | 197 }; |
196 | 198 |
197 | 199 NaClListener::NaClListener(IPC::AttachmentBroker* broker) |
198 NaClListener::NaClListener() : shutdown_event_(true, false), | 200 : shutdown_event_(true, false), |
199 io_thread_("NaCl_IOThread"), | 201 io_thread_("NaCl_IOThread"), |
| 202 broker_(broker), |
200 #if defined(OS_LINUX) | 203 #if defined(OS_LINUX) |
201 prereserved_sandbox_size_(0), | 204 prereserved_sandbox_size_(0), |
202 #endif | 205 #endif |
203 #if defined(OS_POSIX) | 206 #if defined(OS_POSIX) |
204 number_of_cores_(-1), // unknown/error | 207 number_of_cores_(-1), // unknown/error |
205 #endif | 208 #endif |
206 main_loop_(NULL), | 209 main_loop_(NULL), |
207 is_started_(false) { | 210 is_started_(false) { |
208 io_thread_.StartWithOptions( | 211 io_thread_.StartWithOptions( |
209 base::Thread::Options(base::MessageLoop::TYPE_IO, 0)); | 212 base::Thread::Options(base::MessageLoop::TYPE_IO, 0)); |
210 DCHECK(g_listener == NULL); | 213 DCHECK(g_listener == NULL); |
211 g_listener = this; | 214 g_listener = this; |
212 } | 215 } |
213 | 216 |
214 NaClListener::~NaClListener() { | 217 NaClListener::~NaClListener() { |
215 NOTREACHED(); | 218 NOTREACHED(); |
216 shutdown_event_.Signal(); | 219 shutdown_event_.Signal(); |
217 g_listener = NULL; | 220 g_listener = NULL; |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
258 | 261 |
259 void NaClListener::Listen() { | 262 void NaClListener::Listen() { |
260 std::string channel_name = | 263 std::string channel_name = |
261 base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII( | 264 base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII( |
262 switches::kProcessChannelID); | 265 switches::kProcessChannelID); |
263 channel_ = IPC::SyncChannel::Create(this, io_thread_.task_runner().get(), | 266 channel_ = IPC::SyncChannel::Create(this, io_thread_.task_runner().get(), |
264 &shutdown_event_); | 267 &shutdown_event_); |
265 filter_ = new IPC::SyncMessageFilter(&shutdown_event_); | 268 filter_ = new IPC::SyncMessageFilter(&shutdown_event_); |
266 channel_->AddFilter(filter_.get()); | 269 channel_->AddFilter(filter_.get()); |
267 channel_->AddFilter(new FileTokenMessageFilter()); | 270 channel_->AddFilter(new FileTokenMessageFilter()); |
268 channel_->Init(channel_name, IPC::Channel::MODE_CLIENT, true); | 271 channel_->Init(channel_name, IPC::Channel::MODE_CLIENT, true, broker_); |
269 main_loop_ = base::MessageLoop::current(); | 272 main_loop_ = base::MessageLoop::current(); |
270 main_loop_->Run(); | 273 main_loop_->Run(); |
271 } | 274 } |
272 | 275 |
273 bool NaClListener::OnMessageReceived(const IPC::Message& msg) { | 276 bool NaClListener::OnMessageReceived(const IPC::Message& msg) { |
274 bool handled = true; | 277 bool handled = true; |
275 IPC_BEGIN_MESSAGE_MAP(NaClListener, msg) | 278 IPC_BEGIN_MESSAGE_MAP(NaClListener, msg) |
276 IPC_MESSAGE_HANDLER(NaClProcessMsg_AddPrefetchedResource, | 279 IPC_MESSAGE_HANDLER(NaClProcessMsg_AddPrefetchedResource, |
277 OnAddPrefetchedResource) | 280 OnAddPrefetchedResource) |
278 IPC_MESSAGE_HANDLER(NaClProcessMsg_Start, OnStart) | 281 IPC_MESSAGE_HANDLER(NaClProcessMsg_Start, OnStart) |
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
354 browser_handle = IPC::Channel::GenerateVerifiedChannelID("nacl"); | 357 browser_handle = IPC::Channel::GenerateVerifiedChannelID("nacl"); |
355 ppapi_renderer_handle = IPC::Channel::GenerateVerifiedChannelID("nacl"); | 358 ppapi_renderer_handle = IPC::Channel::GenerateVerifiedChannelID("nacl"); |
356 manifest_service_handle = IPC::Channel::GenerateVerifiedChannelID("nacl"); | 359 manifest_service_handle = IPC::Channel::GenerateVerifiedChannelID("nacl"); |
357 | 360 |
358 // Create the PPAPI IPC channels between the NaCl IRT and the host | 361 // Create the PPAPI IPC channels between the NaCl IRT and the host |
359 // (browser/renderer) processes. The IRT uses these channels to | 362 // (browser/renderer) processes. The IRT uses these channels to |
360 // communicate with the host and to initialize the IPC dispatchers. | 363 // communicate with the host and to initialize the IPC dispatchers. |
361 SetUpIPCAdapter(&browser_handle, io_thread_.task_runner(), nap, | 364 SetUpIPCAdapter(&browser_handle, io_thread_.task_runner(), nap, |
362 NACL_CHROME_DESC_BASE, | 365 NACL_CHROME_DESC_BASE, |
363 NaClIPCAdapter::ResolveFileTokenCallback(), | 366 NaClIPCAdapter::ResolveFileTokenCallback(), |
364 NaClIPCAdapter::OpenResourceCallback()); | 367 NaClIPCAdapter::OpenResourceCallback(), broker_); |
365 SetUpIPCAdapter(&ppapi_renderer_handle, io_thread_.task_runner(), nap, | 368 SetUpIPCAdapter(&ppapi_renderer_handle, io_thread_.task_runner(), nap, |
366 NACL_CHROME_DESC_BASE + 1, | 369 NACL_CHROME_DESC_BASE + 1, |
367 NaClIPCAdapter::ResolveFileTokenCallback(), | 370 NaClIPCAdapter::ResolveFileTokenCallback(), |
368 NaClIPCAdapter::OpenResourceCallback()); | 371 NaClIPCAdapter::OpenResourceCallback(), broker_); |
369 SetUpIPCAdapter( | 372 SetUpIPCAdapter( |
370 &manifest_service_handle, io_thread_.task_runner(), nap, | 373 &manifest_service_handle, io_thread_.task_runner(), nap, |
371 NACL_CHROME_DESC_BASE + 2, | 374 NACL_CHROME_DESC_BASE + 2, |
372 base::Bind(&NaClListener::ResolveFileToken, base::Unretained(this)), | 375 base::Bind(&NaClListener::ResolveFileToken, base::Unretained(this)), |
373 base::Bind(&NaClListener::OnOpenResource, base::Unretained(this))); | 376 base::Bind(&NaClListener::OnOpenResource, base::Unretained(this)), |
| 377 broker_); |
374 } | 378 } |
375 | 379 |
376 trusted_listener_ = | 380 trusted_listener_ = |
377 new NaClTrustedListener(IPC::Channel::GenerateVerifiedChannelID("nacl"), | 381 new NaClTrustedListener(IPC::Channel::GenerateVerifiedChannelID("nacl"), |
378 io_thread_.task_runner().get(), &shutdown_event_); | 382 io_thread_.task_runner().get(), &shutdown_event_); |
379 if (!Send(new NaClProcessHostMsg_PpapiChannelsCreated( | 383 if (!Send(new NaClProcessHostMsg_PpapiChannelsCreated( |
380 browser_handle, | 384 browser_handle, |
381 ppapi_renderer_handle, | 385 ppapi_renderer_handle, |
382 trusted_listener_->TakeClientChannelHandle(), | 386 trusted_listener_->TakeClientChannelHandle(), |
383 manifest_service_handle))) | 387 manifest_service_handle))) |
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
496 } | 500 } |
497 | 501 |
498 void NaClListener::OnFileTokenResolved( | 502 void NaClListener::OnFileTokenResolved( |
499 uint64_t token_lo, | 503 uint64_t token_lo, |
500 uint64_t token_hi, | 504 uint64_t token_hi, |
501 IPC::PlatformFileForTransit ipc_fd, | 505 IPC::PlatformFileForTransit ipc_fd, |
502 base::FilePath file_path) { | 506 base::FilePath file_path) { |
503 resolved_cb_.Run(ipc_fd, file_path); | 507 resolved_cb_.Run(ipc_fd, file_path); |
504 resolved_cb_.Reset(); | 508 resolved_cb_.Reset(); |
505 } | 509 } |
OLD | NEW |