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

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: Clean up namespace/#if nesting 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
79 #if defined(OS_WIN) 81 #if defined(OS_WIN)
80
81 namespace { 82 namespace {
82 83
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) {
(...skipping 21 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 140 namespace {
141
142 bool RunningOnWOW64() {
143 return (base::win::OSInfo::GetInstance()->wow64_status() ==
144 base::win::OSInfo::WOW64_ENABLED);
145 }
146
147 } // namespace
142 148
143 #endif // defined(OS_WIN) 149 #endif // defined(OS_WIN)
144 150
145 namespace { 151 namespace {
146 152
147 #if defined(OS_WIN)
148 bool RunningOnWOW64() {
149 return (base::win::OSInfo::GetInstance()->wow64_status() ==
150 base::win::OSInfo::WOW64_ENABLED);
151 }
152 #endif
153
154 // NOTE: changes to this class need to be reviewed by the security team. 153 // NOTE: changes to this class need to be reviewed by the security team.
155 class NaClSandboxedProcessLauncherDelegate 154 class NaClSandboxedProcessLauncherDelegate
156 : public content::SandboxedProcessLauncherDelegate { 155 : public content::SandboxedProcessLauncherDelegate {
157 public: 156 public:
158 NaClSandboxedProcessLauncherDelegate(ChildProcessHost* host) 157 NaClSandboxedProcessLauncherDelegate(ChildProcessHost* host)
159 #if defined(OS_POSIX) 158 #if defined(OS_POSIX)
160 : ipc_fd_(host->TakeClientFileDescriptor()) 159 : ipc_fd_(host->TakeClientFileDescriptor())
161 #endif 160 #endif
162 {} 161 {}
163 162
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
226 nacl::FileDescriptor channel; 225 nacl::FileDescriptor channel;
227 channel.fd = sourceh; 226 channel.fd = sourceh;
228 channel.auto_close = close_source; 227 channel.auto_close = close_source;
229 handles_for_sel_ldr->push_back(channel); 228 handles_for_sel_ldr->push_back(channel);
230 #endif 229 #endif
231 return true; 230 return true;
232 } 231 }
233 232
234 } // namespace 233 } // namespace
235 234
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_ = 235 unsigned NaClProcessHost::keepalive_throttle_interval_milliseconds_ =
250 ppapi::kKeepaliveThrottleIntervalDefaultMilliseconds; 236 ppapi::kKeepaliveThrottleIntervalDefaultMilliseconds;
251 237
252 NaClProcessHost::NaClProcessHost(const GURL& manifest_url, 238 NaClProcessHost::NaClProcessHost(const GURL& manifest_url,
253 base::File nexe_file, 239 base::File nexe_file,
254 const NaClFileToken& nexe_token, 240 const NaClFileToken& nexe_token,
255 ppapi::PpapiPermissions permissions, 241 ppapi::PpapiPermissions permissions,
256 int render_view_id, 242 int render_view_id,
257 uint32 permission_bits, 243 uint32 permission_bits,
258 bool uses_irt, 244 bool uses_irt,
259 bool uses_nonsfi_mode, 245 bool uses_nonsfi_mode,
260 bool enable_dyncode_syscalls, 246 bool enable_dyncode_syscalls,
261 bool enable_exception_handling, 247 bool enable_exception_handling,
262 bool enable_crash_throttling, 248 bool enable_crash_throttling,
263 bool off_the_record, 249 bool off_the_record,
264 const base::FilePath& profile_directory) 250 const base::FilePath& profile_directory)
265 : manifest_url_(manifest_url), 251 : manifest_url_(manifest_url),
266 nexe_file_(nexe_file.Pass()), 252 nexe_file_(nexe_file.Pass()),
267 nexe_token_(nexe_token), 253 nexe_token_(nexe_token),
268 permissions_(permissions), 254 permissions_(permissions),
269 #if defined(OS_WIN) 255 #if defined(OS_WIN)
270 process_launched_by_broker_(false), 256 process_launched_by_broker_(false),
271 #endif 257 #endif
272 reply_msg_(NULL), 258 reply_msg_(NULL),
273 #if defined(OS_WIN) 259 #if defined(OS_WIN)
274 debug_exception_handler_requested_(false), 260 debug_exception_handler_requested_(false),
275 #endif 261 #endif
276 internal_(new NaClInternal()),
277 uses_irt_(uses_irt), 262 uses_irt_(uses_irt),
278 uses_nonsfi_mode_(uses_nonsfi_mode), 263 uses_nonsfi_mode_(uses_nonsfi_mode),
279 enable_debug_stub_(false), 264 enable_debug_stub_(false),
280 enable_dyncode_syscalls_(enable_dyncode_syscalls), 265 enable_dyncode_syscalls_(enable_dyncode_syscalls),
281 enable_exception_handling_(enable_exception_handling), 266 enable_exception_handling_(enable_exception_handling),
282 enable_crash_throttling_(enable_crash_throttling), 267 enable_crash_throttling_(enable_crash_throttling),
283 off_the_record_(off_the_record), 268 off_the_record_(off_the_record),
284 profile_directory_(profile_directory), 269 profile_directory_(profile_directory),
285 render_view_id_(render_view_id), 270 render_view_id_(render_view_id),
286 weak_factory_(this) { 271 weak_factory_(this) {
(...skipping 19 matching lines...) Expand all
306 base::StringPrintf("NaCl process exited with status %i (0x%x)", 291 base::StringPrintf("NaCl process exited with status %i (0x%x)",
307 exit_code, exit_code); 292 exit_code, exit_code);
308 if (exit_code == 0) { 293 if (exit_code == 0) {
309 VLOG(1) << message; 294 VLOG(1) << message;
310 } else { 295 } else {
311 LOG(ERROR) << message; 296 LOG(ERROR) << message;
312 } 297 }
313 NaClBrowser::GetInstance()->OnProcessEnd(process_->GetData().id); 298 NaClBrowser::GetInstance()->OnProcessEnd(process_->GetData().id);
314 } 299 }
315 300
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_) { 301 if (reply_msg_) {
329 // The process failed to launch for some reason. 302 // The process failed to launch for some reason.
330 // Don't keep the renderer hanging. 303 // Don't keep the renderer hanging.
331 reply_msg_->set_reply_error(); 304 reply_msg_->set_reply_error();
332 nacl_host_message_filter_->Send(reply_msg_); 305 nacl_host_message_filter_->Send(reply_msg_);
333 } 306 }
334 #if defined(OS_WIN) 307 #if defined(OS_WIN)
335 if (process_launched_by_broker_) { 308 if (process_launched_by_broker_) {
336 NaClBrokerService::GetInstance()->OnLoaderDied(); 309 NaClBrokerService::GetInstance()->OnLoaderDied();
337 } 310 }
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after
461 // This means the sandboxed renderer cannot send handles to the 434 // This means the sandboxed renderer cannot send handles to the
462 // browser process. 435 // browser process.
463 436
464 NaClHandle pair[2]; 437 NaClHandle pair[2];
465 // Create a connected socket 438 // Create a connected socket
466 if (NaClSocketPair(pair) == -1) { 439 if (NaClSocketPair(pair) == -1) {
467 SendErrorToRenderer("NaClSocketPair() failed"); 440 SendErrorToRenderer("NaClSocketPair() failed");
468 delete this; 441 delete this;
469 return; 442 return;
470 } 443 }
471 internal_->socket_for_renderer = pair[0]; 444 socket_for_renderer_ = base::File(pair[0]);
472 internal_->socket_for_sel_ldr = pair[1]; 445 socket_for_sel_ldr_ = base::File(pair[1]);
473 SetCloseOnExec(pair[0]); 446 SetCloseOnExec(pair[0]);
474 SetCloseOnExec(pair[1]); 447 SetCloseOnExec(pair[1]);
475 } 448 }
476 449
477 // Create a shared memory region that the renderer and plugin share for 450 // Create a shared memory region that the renderer and plugin share for
478 // reporting crash information. 451 // reporting crash information.
479 crash_info_shmem_.CreateAnonymous(kNaClCrashInfoShmemSize); 452 crash_info_shmem_.CreateAnonymous(kNaClCrashInfoShmemSize);
480 453
481 // Launch the process 454 // Launch the process
482 if (!LaunchSelLdr()) { 455 if (!LaunchSelLdr()) {
(...skipping 231 matching lines...) Expand 10 before | Expand all | Expand 10 after
714 return false; 687 return false;
715 } 688 }
716 } 689 }
717 #endif 690 #endif
718 691
719 FileDescriptor imc_handle_for_renderer; 692 FileDescriptor imc_handle_for_renderer;
720 #if defined(OS_WIN) 693 #if defined(OS_WIN)
721 // Copy the handle into the renderer process. 694 // Copy the handle into the renderer process.
722 HANDLE handle_in_renderer; 695 HANDLE handle_in_renderer;
723 if (!DuplicateHandle(base::GetCurrentProcessHandle(), 696 if (!DuplicateHandle(base::GetCurrentProcessHandle(),
724 reinterpret_cast<HANDLE>( 697 socket_for_renderer_.TakePlatformFile(),
725 internal_->socket_for_renderer),
726 nacl_host_message_filter_->PeerHandle(), 698 nacl_host_message_filter_->PeerHandle(),
727 &handle_in_renderer, 699 &handle_in_renderer,
728 0, // Unused given DUPLICATE_SAME_ACCESS. 700 0, // Unused given DUPLICATE_SAME_ACCESS.
729 FALSE, 701 FALSE,
730 DUPLICATE_CLOSE_SOURCE | DUPLICATE_SAME_ACCESS)) { 702 DUPLICATE_CLOSE_SOURCE | DUPLICATE_SAME_ACCESS)) {
731 SendErrorToRenderer("DuplicateHandle() failed"); 703 SendErrorToRenderer("DuplicateHandle() failed");
732 return false; 704 return false;
733 } 705 }
734 imc_handle_for_renderer = reinterpret_cast<FileDescriptor>( 706 imc_handle_for_renderer = reinterpret_cast<FileDescriptor>(
735 handle_in_renderer); 707 handle_in_renderer);
736 #else 708 #else
737 // No need to dup the imc_handle - we don't pass it anywhere else so 709 // No need to dup the imc_handle - we don't pass it anywhere else so
738 // it cannot be closed. 710 // it cannot be closed.
739 FileDescriptor imc_handle; 711 FileDescriptor imc_handle;
740 imc_handle.fd = internal_->socket_for_renderer; 712 imc_handle.fd = socket_for_renderer_.TakePlatformFile();
741 imc_handle.auto_close = true; 713 imc_handle.auto_close = true;
742 imc_handle_for_renderer = imc_handle; 714 imc_handle_for_renderer = imc_handle;
743 #endif 715 #endif
744 716
745 const ChildProcessData& data = process_->GetData(); 717 const ChildProcessData& data = process_->GetData();
746 base::SharedMemoryHandle crash_info_shmem_renderer_handle; 718 base::SharedMemoryHandle crash_info_shmem_renderer_handle;
747 if (!crash_info_shmem_.ShareToProcess(nacl_host_message_filter_->PeerHandle(), 719 if (!crash_info_shmem_.ShareToProcess(nacl_host_message_filter_->PeerHandle(),
748 &crash_info_shmem_renderer_handle)) { 720 &crash_info_shmem_renderer_handle)) {
749 SendErrorToRenderer("ShareToProcess() failed"); 721 SendErrorToRenderer("ShareToProcess() failed");
750 return false; 722 return false;
751 } 723 }
752 724
753 SendMessageToRenderer( 725 SendMessageToRenderer(
754 NaClLaunchResult(imc_handle_for_renderer, 726 NaClLaunchResult(imc_handle_for_renderer,
755 ppapi_channel_handle, 727 ppapi_channel_handle,
756 trusted_channel_handle, 728 trusted_channel_handle,
757 manifest_service_channel_handle, 729 manifest_service_channel_handle,
758 base::GetProcId(data.handle), 730 base::GetProcId(data.handle),
759 data.id, 731 data.id,
760 crash_info_shmem_renderer_handle), 732 crash_info_shmem_renderer_handle),
761 std::string() /* error_message */); 733 std::string() /* error_message */);
762 internal_->socket_for_renderer = NACL_INVALID_HANDLE;
763 734
764 // Now that the crash information shmem handles have been shared with the 735 // Now that the crash information shmem handles have been shared with the
765 // plugin and the renderer, the browser can close its handle. 736 // plugin and the renderer, the browser can close its handle.
766 crash_info_shmem_.Close(); 737 crash_info_shmem_.Close();
767 return true; 738 return true;
768 } 739 }
769 740
770 void NaClProcessHost::SendErrorToRenderer(const std::string& error_message) { 741 void NaClProcessHost::SendErrorToRenderer(const std::string& error_message) {
771 LOG(ERROR) << "NaCl process launch failed: " << error_message; 742 LOG(ERROR) << "NaCl process launch failed: " << error_message;
772 SendMessageToRenderer(NaClLaunchResult(), error_message); 743 SendMessageToRenderer(NaClLaunchResult(), error_message);
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
837 808
838 NaClStartParams params; 809 NaClStartParams params;
839 810
840 // Enable PPAPI proxy channel creation only for renderer processes. 811 // Enable PPAPI proxy channel creation only for renderer processes.
841 params.enable_ipc_proxy = enable_ppapi_proxy(); 812 params.enable_ipc_proxy = enable_ppapi_proxy();
842 if (uses_nonsfi_mode_) { 813 if (uses_nonsfi_mode_) {
843 // Currently, non-SFI mode is supported only on Linux. 814 // Currently, non-SFI mode is supported only on Linux.
844 #if defined(OS_LINUX) 815 #if defined(OS_LINUX)
845 // In non-SFI mode, we do not use SRPC. Make sure that the socketpair is 816 // In non-SFI mode, we do not use SRPC. Make sure that the socketpair is
846 // not created. 817 // not created.
847 DCHECK_EQ(internal_->socket_for_sel_ldr, NACL_INVALID_HANDLE); 818 DCHECK(!socket_for_sel_ldr_.IsValid());
848 #endif 819 #endif
849 } else { 820 } else {
850 params.validation_cache_enabled = nacl_browser->ValidationCacheIsEnabled(); 821 params.validation_cache_enabled = nacl_browser->ValidationCacheIsEnabled();
851 params.validation_cache_key = nacl_browser->GetValidationCacheKey(); 822 params.validation_cache_key = nacl_browser->GetValidationCacheKey();
852 params.version = NaClBrowser::GetDelegate()->GetVersionString(); 823 params.version = NaClBrowser::GetDelegate()->GetVersionString();
853 params.enable_exception_handling = enable_exception_handling_; 824 params.enable_exception_handling = enable_exception_handling_;
854 params.enable_debug_stub = enable_debug_stub_ && 825 params.enable_debug_stub = enable_debug_stub_ &&
855 NaClBrowser::GetDelegate()->URLMatchesDebugPatterns(manifest_url_); 826 NaClBrowser::GetDelegate()->URLMatchesDebugPatterns(manifest_url_);
856 params.uses_irt = uses_irt_; 827 params.uses_irt = uses_irt_;
857 params.enable_dyncode_syscalls = enable_dyncode_syscalls_; 828 params.enable_dyncode_syscalls = enable_dyncode_syscalls_;
858 829
859 // TODO(teravest): Resolve the file tokens right now instead of making the 830 // TODO(teravest): Resolve the file tokens right now instead of making the
860 // loader send IPC to resolve them later. 831 // loader send IPC to resolve them later.
861 params.nexe_token_lo = nexe_token_.lo; 832 params.nexe_token_lo = nexe_token_.lo;
862 params.nexe_token_hi = nexe_token_.hi; 833 params.nexe_token_hi = nexe_token_.hi;
863 834
864 const ChildProcessData& data = process_->GetData(); 835 const ChildProcessData& data = process_->GetData();
865 if (!ShareHandleToSelLdr(data.handle, 836 if (!ShareHandleToSelLdr(data.handle,
866 internal_->socket_for_sel_ldr, true, 837 socket_for_sel_ldr_.TakePlatformFile(),
838 true,
867 &params.handles)) { 839 &params.handles)) {
868 return false; 840 return false;
869 } 841 }
870 842
871 if (params.uses_irt) { 843 if (params.uses_irt) {
872 const base::File& irt_file = nacl_browser->IrtFile(); 844 const base::File& irt_file = nacl_browser->IrtFile();
873 CHECK(irt_file.IsValid()); 845 CHECK(irt_file.IsValid());
874 // Send over the IRT file handle. We don't close our own copy! 846 // Send over the IRT file handle. We don't close our own copy!
875 if (!ShareHandleToSelLdr(data.handle, irt_file.GetPlatformFile(), false, 847 if (!ShareHandleToSelLdr(data.handle, irt_file.GetPlatformFile(), false,
876 &params.handles)) { 848 &params.handles)) {
(...skipping 28 matching lines...) Expand all
905 if (params.enable_debug_stub) { 877 if (params.enable_debug_stub) {
906 net::SocketDescriptor server_bound_socket = GetDebugStubSocketHandle(); 878 net::SocketDescriptor server_bound_socket = GetDebugStubSocketHandle();
907 if (server_bound_socket != net::kInvalidSocket) { 879 if (server_bound_socket != net::kInvalidSocket) {
908 params.debug_stub_server_bound_socket = 880 params.debug_stub_server_bound_socket =
909 FileDescriptor(server_bound_socket, true); 881 FileDescriptor(server_bound_socket, true);
910 } 882 }
911 } 883 }
912 #endif 884 #endif
913 } 885 }
914 886
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(), 887 params.nexe_file = IPC::TakeFileHandleForProcess(nexe_file_.Pass(),
920 process_->GetData().handle); 888 process_->GetData().handle);
921 if (!crash_info_shmem_.ShareToProcess(process_->GetData().handle, 889 if (!crash_info_shmem_.ShareToProcess(process_->GetData().handle,
922 &params.crash_info_shmem_handle)) { 890 &params.crash_info_shmem_handle)) {
923 DLOG(ERROR) << "Failed to ShareToProcess() a shared memory buffer"; 891 DLOG(ERROR) << "Failed to ShareToProcess() a shared memory buffer";
924 return false; 892 return false;
925 } 893 }
926 894
927 process_->Send(new NaClProcessMsg_Start(params)); 895 process_->Send(new NaClProcessMsg_Start(params));
928 return true; 896 return true;
(...skipping 298 matching lines...) Expand 10 before | Expand all | Expand 10 after
1227 process_handle.Take(), info, 1195 process_handle.Take(), info,
1228 base::MessageLoopProxy::current(), 1196 base::MessageLoopProxy::current(),
1229 base::Bind(&NaClProcessHost::OnDebugExceptionHandlerLaunchedByBroker, 1197 base::Bind(&NaClProcessHost::OnDebugExceptionHandlerLaunchedByBroker,
1230 weak_factory_.GetWeakPtr())); 1198 weak_factory_.GetWeakPtr()));
1231 return true; 1199 return true;
1232 } 1200 }
1233 } 1201 }
1234 #endif 1202 #endif
1235 1203
1236 } // namespace nacl 1204 } // 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