Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(146)

Side by Side Diff: components/nacl/browser/nacl_process_host.cc

Issue 552183004: NaCl: Use RAII for sockets in NaClProcessHost. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « components/nacl/browser/nacl_process_host.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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/browser/nacl_process_host.h" 5 #include "components/nacl/browser/nacl_process_host.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <string> 8 #include <string>
9 #include <vector> 9 #include <vector>
10 10
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
69 #include "components/nacl/browser/nacl_broker_service_win.h" 69 #include "components/nacl/browser/nacl_broker_service_win.h"
70 #include "components/nacl/common/nacl_debug_exception_handler_win.h" 70 #include "components/nacl/common/nacl_debug_exception_handler_win.h"
71 #include "content/public/common/sandbox_init.h" 71 #include "content/public/common/sandbox_init.h"
72 #endif 72 #endif
73 73
74 using content::BrowserThread; 74 using content::BrowserThread;
75 using content::ChildProcessData; 75 using content::ChildProcessData;
76 using content::ChildProcessHost; 76 using content::ChildProcessHost;
77 using ppapi::proxy::SerializedHandle; 77 using ppapi::proxy::SerializedHandle;
78 78
79 namespace nacl {
80 namespace {
81
79 #if defined(OS_WIN) 82 #if defined(OS_WIN)
80 83
81 namespace {
82
83 // Looks for the largest contiguous unallocated region of address 84 // Looks for the largest contiguous unallocated region of address
84 // space and returns it via |*out_addr| and |*out_size|. 85 // space and returns it via |*out_addr| and |*out_size|.
85 void FindAddressSpace(base::ProcessHandle process, 86 void FindAddressSpace(base::ProcessHandle process,
86 char** out_addr, size_t* out_size) { 87 char** out_addr, size_t* out_size) {
87 *out_addr = NULL; 88 *out_addr = NULL;
88 *out_size = 0; 89 *out_size = 0;
89 char* addr = 0; 90 char* addr = 0;
90 while (true) { 91 while (true) {
91 MEMORY_BASIC_INFORMATION info; 92 MEMORY_BASIC_INFORMATION info;
92 size_t result = VirtualQueryEx(process, static_cast<void*>(addr), 93 size_t result = VirtualQueryEx(process, static_cast<void*>(addr),
(...skipping 19 matching lines...) Expand all
112 if (*i == dir) 113 if (*i == dir)
113 return true; 114 return true;
114 } 115 }
115 return false; 116 return false;
116 } 117 }
117 118
118 #endif // _DLL 119 #endif // _DLL
119 120
120 } // namespace 121 } // namespace
121 122
122 namespace nacl {
123
124 // Allocates |size| bytes of address space in the given process at a 123 // Allocates |size| bytes of address space in the given process at a
125 // randomised address. 124 // randomised address.
126 void* AllocateAddressSpaceASLR(base::ProcessHandle process, size_t size) { 125 void* AllocateAddressSpaceASLR(base::ProcessHandle process, size_t size) {
127 char* addr; 126 char* addr;
128 size_t avail_size; 127 size_t avail_size;
129 FindAddressSpace(process, &addr, &avail_size); 128 FindAddressSpace(process, &addr, &avail_size);
130 if (avail_size < size) 129 if (avail_size < size)
131 return NULL; 130 return NULL;
132 size_t offset = base::RandGenerator(avail_size - size); 131 size_t offset = base::RandGenerator(avail_size - size);
133 const int kPageSize = 0x10000; 132 const int kPageSize = 0x10000;
134 void* request_addr = 133 void* request_addr =
135 reinterpret_cast<void*>(reinterpret_cast<uint64>(addr + offset) 134 reinterpret_cast<void*>(reinterpret_cast<uint64>(addr + offset)
136 & ~(kPageSize - 1)); 135 & ~(kPageSize - 1));
137 return VirtualAllocEx(process, request_addr, size, 136 return VirtualAllocEx(process, request_addr, size,
138 MEM_RESERVE, PAGE_NOACCESS); 137 MEM_RESERVE, PAGE_NOACCESS);
139 } 138 }
140 139
141 } // namespace nacl
142
143 #endif // defined(OS_WIN)
144
145 namespace { 140 namespace {
146 141
147 #if defined(OS_WIN)
148 bool RunningOnWOW64() { 142 bool RunningOnWOW64() {
149 return (base::win::OSInfo::GetInstance()->wow64_status() == 143 return (base::win::OSInfo::GetInstance()->wow64_status() ==
150 base::win::OSInfo::WOW64_ENABLED); 144 base::win::OSInfo::WOW64_ENABLED);
151 } 145 }
152 #endif 146
147 #endif // defined(OS_WIN)
Mark Seaborn 2014/09/11 20:43:26 Having #if/#endif nesting not nest with namespace{
153 148
154 // NOTE: changes to this class need to be reviewed by the security team. 149 // NOTE: changes to this class need to be reviewed by the security team.
155 class NaClSandboxedProcessLauncherDelegate 150 class NaClSandboxedProcessLauncherDelegate
156 : public content::SandboxedProcessLauncherDelegate { 151 : public content::SandboxedProcessLauncherDelegate {
157 public: 152 public:
158 NaClSandboxedProcessLauncherDelegate(ChildProcessHost* host) 153 NaClSandboxedProcessLauncherDelegate(ChildProcessHost* host)
159 #if defined(OS_POSIX) 154 #if defined(OS_POSIX)
160 : ipc_fd_(host->TakeClientFileDescriptor()) 155 : ipc_fd_(host->TakeClientFileDescriptor())
161 #endif 156 #endif
162 {} 157 {}
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
226 nacl::FileDescriptor channel; 221 nacl::FileDescriptor channel;
227 channel.fd = sourceh; 222 channel.fd = sourceh;
228 channel.auto_close = close_source; 223 channel.auto_close = close_source;
229 handles_for_sel_ldr->push_back(channel); 224 handles_for_sel_ldr->push_back(channel);
230 #endif 225 #endif
231 return true; 226 return true;
232 } 227 }
233 228
234 } // namespace 229 } // namespace
235 230
236 namespace nacl {
237
238 struct NaClProcessHost::NaClInternal {
239 NaClHandle socket_for_renderer;
240 NaClHandle socket_for_sel_ldr;
241
242 NaClInternal()
243 : socket_for_renderer(NACL_INVALID_HANDLE),
244 socket_for_sel_ldr(NACL_INVALID_HANDLE) { }
245 };
246
247 // -----------------------------------------------------------------------------
248
249 unsigned NaClProcessHost::keepalive_throttle_interval_milliseconds_ = 231 unsigned NaClProcessHost::keepalive_throttle_interval_milliseconds_ =
250 ppapi::kKeepaliveThrottleIntervalDefaultMilliseconds; 232 ppapi::kKeepaliveThrottleIntervalDefaultMilliseconds;
251 233
252 NaClProcessHost::NaClProcessHost(const GURL& manifest_url, 234 NaClProcessHost::NaClProcessHost(const GURL& manifest_url,
253 base::File nexe_file, 235 base::File nexe_file,
254 const NaClFileToken& nexe_token, 236 const NaClFileToken& nexe_token,
255 ppapi::PpapiPermissions permissions, 237 ppapi::PpapiPermissions permissions,
256 int render_view_id, 238 int render_view_id,
257 uint32 permission_bits, 239 uint32 permission_bits,
258 bool uses_irt, 240 bool uses_irt,
259 bool uses_nonsfi_mode, 241 bool uses_nonsfi_mode,
260 bool enable_dyncode_syscalls, 242 bool enable_dyncode_syscalls,
261 bool enable_exception_handling, 243 bool enable_exception_handling,
262 bool enable_crash_throttling, 244 bool enable_crash_throttling,
263 bool off_the_record, 245 bool off_the_record,
264 const base::FilePath& profile_directory) 246 const base::FilePath& profile_directory)
265 : manifest_url_(manifest_url), 247 : manifest_url_(manifest_url),
266 nexe_file_(nexe_file.Pass()), 248 nexe_file_(nexe_file.Pass()),
267 nexe_token_(nexe_token), 249 nexe_token_(nexe_token),
268 permissions_(permissions), 250 permissions_(permissions),
269 #if defined(OS_WIN) 251 #if defined(OS_WIN)
270 process_launched_by_broker_(false), 252 process_launched_by_broker_(false),
271 #endif 253 #endif
272 reply_msg_(NULL), 254 reply_msg_(NULL),
273 #if defined(OS_WIN) 255 #if defined(OS_WIN)
274 debug_exception_handler_requested_(false), 256 debug_exception_handler_requested_(false),
275 #endif 257 #endif
276 internal_(new NaClInternal()),
277 uses_irt_(uses_irt), 258 uses_irt_(uses_irt),
278 uses_nonsfi_mode_(uses_nonsfi_mode), 259 uses_nonsfi_mode_(uses_nonsfi_mode),
279 enable_debug_stub_(false), 260 enable_debug_stub_(false),
280 enable_dyncode_syscalls_(enable_dyncode_syscalls), 261 enable_dyncode_syscalls_(enable_dyncode_syscalls),
281 enable_exception_handling_(enable_exception_handling), 262 enable_exception_handling_(enable_exception_handling),
282 enable_crash_throttling_(enable_crash_throttling), 263 enable_crash_throttling_(enable_crash_throttling),
283 off_the_record_(off_the_record), 264 off_the_record_(off_the_record),
284 profile_directory_(profile_directory), 265 profile_directory_(profile_directory),
285 render_view_id_(render_view_id), 266 render_view_id_(render_view_id),
286 weak_factory_(this) { 267 weak_factory_(this) {
(...skipping 19 matching lines...) Expand all
306 base::StringPrintf("NaCl process exited with status %i (0x%x)", 287 base::StringPrintf("NaCl process exited with status %i (0x%x)",
307 exit_code, exit_code); 288 exit_code, exit_code);
308 if (exit_code == 0) { 289 if (exit_code == 0) {
309 VLOG(1) << message; 290 VLOG(1) << message;
310 } else { 291 } else {
311 LOG(ERROR) << message; 292 LOG(ERROR) << message;
312 } 293 }
313 NaClBrowser::GetInstance()->OnProcessEnd(process_->GetData().id); 294 NaClBrowser::GetInstance()->OnProcessEnd(process_->GetData().id);
314 } 295 }
315 296
316 if (internal_->socket_for_renderer != NACL_INVALID_HANDLE) {
317 if (NaClClose(internal_->socket_for_renderer) != 0) {
318 NOTREACHED() << "NaClClose() failed";
319 }
320 }
321
322 if (internal_->socket_for_sel_ldr != NACL_INVALID_HANDLE) {
323 if (NaClClose(internal_->socket_for_sel_ldr) != 0) {
324 NOTREACHED() << "NaClClose() failed";
325 }
326 }
327
328 if (reply_msg_) { 297 if (reply_msg_) {
329 // The process failed to launch for some reason. 298 // The process failed to launch for some reason.
330 // Don't keep the renderer hanging. 299 // Don't keep the renderer hanging.
331 reply_msg_->set_reply_error(); 300 reply_msg_->set_reply_error();
332 nacl_host_message_filter_->Send(reply_msg_); 301 nacl_host_message_filter_->Send(reply_msg_);
333 } 302 }
334 #if defined(OS_WIN) 303 #if defined(OS_WIN)
335 if (process_launched_by_broker_) { 304 if (process_launched_by_broker_) {
336 NaClBrokerService::GetInstance()->OnLoaderDied(); 305 NaClBrokerService::GetInstance()->OnLoaderDied();
337 } 306 }
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after
461 // This means the sandboxed renderer cannot send handles to the 430 // This means the sandboxed renderer cannot send handles to the
462 // browser process. 431 // browser process.
463 432
464 NaClHandle pair[2]; 433 NaClHandle pair[2];
465 // Create a connected socket 434 // Create a connected socket
466 if (NaClSocketPair(pair) == -1) { 435 if (NaClSocketPair(pair) == -1) {
467 SendErrorToRenderer("NaClSocketPair() failed"); 436 SendErrorToRenderer("NaClSocketPair() failed");
468 delete this; 437 delete this;
469 return; 438 return;
470 } 439 }
471 internal_->socket_for_renderer = pair[0]; 440 socket_for_renderer_ = base::File(pair[0]);
472 internal_->socket_for_sel_ldr = pair[1]; 441 socket_for_sel_ldr_ = base::File(pair[1]);
473 SetCloseOnExec(pair[0]); 442 SetCloseOnExec(pair[0]);
474 SetCloseOnExec(pair[1]); 443 SetCloseOnExec(pair[1]);
475 } 444 }
476 445
477 // Create a shared memory region that the renderer and plugin share for 446 // Create a shared memory region that the renderer and plugin share for
478 // reporting crash information. 447 // reporting crash information.
479 crash_info_shmem_.CreateAnonymous(kNaClCrashInfoShmemSize); 448 crash_info_shmem_.CreateAnonymous(kNaClCrashInfoShmemSize);
480 449
481 // Launch the process 450 // Launch the process
482 if (!LaunchSelLdr()) { 451 if (!LaunchSelLdr()) {
(...skipping 231 matching lines...) Expand 10 before | Expand all | Expand 10 after
714 return false; 683 return false;
715 } 684 }
716 } 685 }
717 #endif 686 #endif
718 687
719 FileDescriptor imc_handle_for_renderer; 688 FileDescriptor imc_handle_for_renderer;
720 #if defined(OS_WIN) 689 #if defined(OS_WIN)
721 // Copy the handle into the renderer process. 690 // Copy the handle into the renderer process.
722 HANDLE handle_in_renderer; 691 HANDLE handle_in_renderer;
723 if (!DuplicateHandle(base::GetCurrentProcessHandle(), 692 if (!DuplicateHandle(base::GetCurrentProcessHandle(),
724 reinterpret_cast<HANDLE>( 693 socket_for_renderer_.TakePlatformFile(),
725 internal_->socket_for_renderer),
726 nacl_host_message_filter_->PeerHandle(), 694 nacl_host_message_filter_->PeerHandle(),
727 &handle_in_renderer, 695 &handle_in_renderer,
728 0, // Unused given DUPLICATE_SAME_ACCESS. 696 0, // Unused given DUPLICATE_SAME_ACCESS.
729 FALSE, 697 FALSE,
730 DUPLICATE_CLOSE_SOURCE | DUPLICATE_SAME_ACCESS)) { 698 DUPLICATE_CLOSE_SOURCE | DUPLICATE_SAME_ACCESS)) {
731 SendErrorToRenderer("DuplicateHandle() failed"); 699 SendErrorToRenderer("DuplicateHandle() failed");
732 return false; 700 return false;
733 } 701 }
734 imc_handle_for_renderer = reinterpret_cast<FileDescriptor>( 702 imc_handle_for_renderer = reinterpret_cast<FileDescriptor>(
735 handle_in_renderer); 703 handle_in_renderer);
736 #else 704 #else
737 // No need to dup the imc_handle - we don't pass it anywhere else so 705 // No need to dup the imc_handle - we don't pass it anywhere else so
738 // it cannot be closed. 706 // it cannot be closed.
739 FileDescriptor imc_handle; 707 FileDescriptor imc_handle;
740 imc_handle.fd = internal_->socket_for_renderer; 708 imc_handle.fd = socket_for_renderer_.TakePlatformFile();
741 imc_handle.auto_close = true; 709 imc_handle.auto_close = true;
742 imc_handle_for_renderer = imc_handle; 710 imc_handle_for_renderer = imc_handle;
743 #endif 711 #endif
744 712
745 const ChildProcessData& data = process_->GetData(); 713 const ChildProcessData& data = process_->GetData();
746 base::SharedMemoryHandle crash_info_shmem_renderer_handle; 714 base::SharedMemoryHandle crash_info_shmem_renderer_handle;
747 if (!crash_info_shmem_.ShareToProcess(nacl_host_message_filter_->PeerHandle(), 715 if (!crash_info_shmem_.ShareToProcess(nacl_host_message_filter_->PeerHandle(),
748 &crash_info_shmem_renderer_handle)) { 716 &crash_info_shmem_renderer_handle)) {
749 SendErrorToRenderer("ShareToProcess() failed"); 717 SendErrorToRenderer("ShareToProcess() failed");
750 return false; 718 return false;
751 } 719 }
752 720
753 SendMessageToRenderer( 721 SendMessageToRenderer(
754 NaClLaunchResult(imc_handle_for_renderer, 722 NaClLaunchResult(imc_handle_for_renderer,
755 ppapi_channel_handle, 723 ppapi_channel_handle,
756 trusted_channel_handle, 724 trusted_channel_handle,
757 manifest_service_channel_handle, 725 manifest_service_channel_handle,
758 base::GetProcId(data.handle), 726 base::GetProcId(data.handle),
759 data.id, 727 data.id,
760 crash_info_shmem_renderer_handle), 728 crash_info_shmem_renderer_handle),
761 std::string() /* error_message */); 729 std::string() /* error_message */);
762 internal_->socket_for_renderer = NACL_INVALID_HANDLE;
763 730
764 // Now that the crash information shmem handles have been shared with the 731 // Now that the crash information shmem handles have been shared with the
765 // plugin and the renderer, the browser can close its handle. 732 // plugin and the renderer, the browser can close its handle.
766 crash_info_shmem_.Close(); 733 crash_info_shmem_.Close();
767 return true; 734 return true;
768 } 735 }
769 736
770 void NaClProcessHost::SendErrorToRenderer(const std::string& error_message) { 737 void NaClProcessHost::SendErrorToRenderer(const std::string& error_message) {
771 LOG(ERROR) << "NaCl process launch failed: " << error_message; 738 LOG(ERROR) << "NaCl process launch failed: " << error_message;
772 SendMessageToRenderer(NaClLaunchResult(), error_message); 739 SendMessageToRenderer(NaClLaunchResult(), error_message);
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
837 804
838 NaClStartParams params; 805 NaClStartParams params;
839 806
840 // Enable PPAPI proxy channel creation only for renderer processes. 807 // Enable PPAPI proxy channel creation only for renderer processes.
841 params.enable_ipc_proxy = enable_ppapi_proxy(); 808 params.enable_ipc_proxy = enable_ppapi_proxy();
842 if (uses_nonsfi_mode_) { 809 if (uses_nonsfi_mode_) {
843 // Currently, non-SFI mode is supported only on Linux. 810 // Currently, non-SFI mode is supported only on Linux.
844 #if defined(OS_LINUX) 811 #if defined(OS_LINUX)
845 // In non-SFI mode, we do not use SRPC. Make sure that the socketpair is 812 // In non-SFI mode, we do not use SRPC. Make sure that the socketpair is
846 // not created. 813 // not created.
847 DCHECK_EQ(internal_->socket_for_sel_ldr, NACL_INVALID_HANDLE); 814 DCHECK(!socket_for_sel_ldr_.IsValid());
848 #endif 815 #endif
849 } else { 816 } else {
850 params.validation_cache_enabled = nacl_browser->ValidationCacheIsEnabled(); 817 params.validation_cache_enabled = nacl_browser->ValidationCacheIsEnabled();
851 params.validation_cache_key = nacl_browser->GetValidationCacheKey(); 818 params.validation_cache_key = nacl_browser->GetValidationCacheKey();
852 params.version = NaClBrowser::GetDelegate()->GetVersionString(); 819 params.version = NaClBrowser::GetDelegate()->GetVersionString();
853 params.enable_exception_handling = enable_exception_handling_; 820 params.enable_exception_handling = enable_exception_handling_;
854 params.enable_debug_stub = enable_debug_stub_ && 821 params.enable_debug_stub = enable_debug_stub_ &&
855 NaClBrowser::GetDelegate()->URLMatchesDebugPatterns(manifest_url_); 822 NaClBrowser::GetDelegate()->URLMatchesDebugPatterns(manifest_url_);
856 params.uses_irt = uses_irt_; 823 params.uses_irt = uses_irt_;
857 params.enable_dyncode_syscalls = enable_dyncode_syscalls_; 824 params.enable_dyncode_syscalls = enable_dyncode_syscalls_;
858 825
859 // TODO(teravest): Resolve the file tokens right now instead of making the 826 // TODO(teravest): Resolve the file tokens right now instead of making the
860 // loader send IPC to resolve them later. 827 // loader send IPC to resolve them later.
861 params.nexe_token_lo = nexe_token_.lo; 828 params.nexe_token_lo = nexe_token_.lo;
862 params.nexe_token_hi = nexe_token_.hi; 829 params.nexe_token_hi = nexe_token_.hi;
863 830
864 const ChildProcessData& data = process_->GetData(); 831 const ChildProcessData& data = process_->GetData();
865 if (!ShareHandleToSelLdr(data.handle, 832 if (!ShareHandleToSelLdr(data.handle,
866 internal_->socket_for_sel_ldr, true, 833 socket_for_sel_ldr_.TakePlatformFile(),
834 true,
867 &params.handles)) { 835 &params.handles)) {
868 return false; 836 return false;
869 } 837 }
870 838
871 if (params.uses_irt) { 839 if (params.uses_irt) {
872 const base::File& irt_file = nacl_browser->IrtFile(); 840 const base::File& irt_file = nacl_browser->IrtFile();
873 CHECK(irt_file.IsValid()); 841 CHECK(irt_file.IsValid());
874 // Send over the IRT file handle. We don't close our own copy! 842 // Send over the IRT file handle. We don't close our own copy!
875 if (!ShareHandleToSelLdr(data.handle, irt_file.GetPlatformFile(), false, 843 if (!ShareHandleToSelLdr(data.handle, irt_file.GetPlatformFile(), false,
876 &params.handles)) { 844 &params.handles)) {
(...skipping 28 matching lines...) Expand all
905 if (params.enable_debug_stub) { 873 if (params.enable_debug_stub) {
906 net::SocketDescriptor server_bound_socket = GetDebugStubSocketHandle(); 874 net::SocketDescriptor server_bound_socket = GetDebugStubSocketHandle();
907 if (server_bound_socket != net::kInvalidSocket) { 875 if (server_bound_socket != net::kInvalidSocket) {
908 params.debug_stub_server_bound_socket = 876 params.debug_stub_server_bound_socket =
909 FileDescriptor(server_bound_socket, true); 877 FileDescriptor(server_bound_socket, true);
910 } 878 }
911 } 879 }
912 #endif 880 #endif
913 } 881 }
914 882
915 if (!uses_nonsfi_mode_) {
916 internal_->socket_for_sel_ldr = NACL_INVALID_HANDLE;
917 }
918
919 params.nexe_file = IPC::TakeFileHandleForProcess(nexe_file_.Pass(), 883 params.nexe_file = IPC::TakeFileHandleForProcess(nexe_file_.Pass(),
920 process_->GetData().handle); 884 process_->GetData().handle);
921 if (!crash_info_shmem_.ShareToProcess(process_->GetData().handle, 885 if (!crash_info_shmem_.ShareToProcess(process_->GetData().handle,
922 &params.crash_info_shmem_handle)) { 886 &params.crash_info_shmem_handle)) {
923 DLOG(ERROR) << "Failed to ShareToProcess() a shared memory buffer"; 887 DLOG(ERROR) << "Failed to ShareToProcess() a shared memory buffer";
924 return false; 888 return false;
925 } 889 }
926 890
927 process_->Send(new NaClProcessMsg_Start(params)); 891 process_->Send(new NaClProcessMsg_Start(params));
928 return true; 892 return true;
(...skipping 298 matching lines...) Expand 10 before | Expand all | Expand 10 after
1227 process_handle.Take(), info, 1191 process_handle.Take(), info,
1228 base::MessageLoopProxy::current(), 1192 base::MessageLoopProxy::current(),
1229 base::Bind(&NaClProcessHost::OnDebugExceptionHandlerLaunchedByBroker, 1193 base::Bind(&NaClProcessHost::OnDebugExceptionHandlerLaunchedByBroker,
1230 weak_factory_.GetWeakPtr())); 1194 weak_factory_.GetWeakPtr()));
1231 return true; 1195 return true;
1232 } 1196 }
1233 } 1197 }
1234 #endif 1198 #endif
1235 1199
1236 } // namespace nacl 1200 } // namespace nacl
OLDNEW
« no previous file with comments | « components/nacl/browser/nacl_process_host.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698