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

Unified Diff: components/nacl/renderer/ppb_nacl_private_impl.cc

Issue 1094653003: Refactor NaClProcessHost. Reduce chances to leak the resource. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 7 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 side-by-side diff with in-line comments
Download patch
Index: components/nacl/renderer/ppb_nacl_private_impl.cc
diff --git a/components/nacl/renderer/ppb_nacl_private_impl.cc b/components/nacl/renderer/ppb_nacl_private_impl.cc
index 10018950037467e9b55c565a2c6208f051bbdd31..5ebc61f9080f00ec125b9a5d1a468421047f62dc 100644
--- a/components/nacl/renderer/ppb_nacl_private_impl.cc
+++ b/components/nacl/renderer/ppb_nacl_private_impl.cc
@@ -385,7 +385,6 @@ void LaunchSelLdr(PP_Instance instance,
scoped_ptr<ManifestServiceChannel::Delegate> manifest_service_proxy(
new ManifestServiceProxy(instance, process_type));
- FileDescriptor result_socket;
IPC::Sender* sender = content::RenderThread::Get();
DCHECK(sender);
int routing_id = GetRoutingID(instance);
@@ -415,11 +414,6 @@ void LaunchSelLdr(PP_Instance instance,
perm_bits |= ppapi::PERMISSION_DEV;
instance_info.permissions =
ppapi::PpapiPermissions::GetForCommandLine(perm_bits);
- std::string error_message_string;
- NaClLaunchResult launch_result;
-
- IPC::PlatformFileForTransit nexe_for_transit =
- IPC::InvalidPlatformFileForTransit();
std::vector<NaClResourcePrefetchRequest> resource_prefetch_request_list;
if (process_type == kNativeNaClProcessType) {
@@ -438,6 +432,8 @@ void LaunchSelLdr(PP_Instance instance,
}
}
+ IPC::PlatformFileForTransit nexe_for_transit =
+ IPC::InvalidPlatformFileForTransit();
#if defined(OS_POSIX)
if (nexe_file_info->handle != PP_kInvalidFileHandle)
nexe_for_transit = base::FileDescriptor(nexe_file_info->handle, true);
@@ -447,8 +443,11 @@ void LaunchSelLdr(PP_Instance instance,
// it's simpler to do the duplication in the browser anyway.
nexe_for_transit = nexe_file_info->handle;
#else
-#error Unsupported target platform.
+# error Unsupported target platform.
#endif
+
+ std::string error_message_string;
+ NaClLaunchResult launch_result;
if (!sender->Send(new NaClHostMsg_LaunchNaCl(
NaClLaunchParams(
instance_info.url.spec(),
@@ -472,6 +471,12 @@ void LaunchSelLdr(PP_Instance instance,
load_manager->set_nonsfi(PP_ToBool(uses_nonsfi_mode));
if (!error_message_string.empty()) {
+ // Even on error, some FDs/handles may be passed to here.
+ // We must release those resources.
+ // See also nacl_process_host.cc.
+ IPC::PlatformFileForTransitToFile(launch_result.imc_channel_handle);
+ base::SharedMemory::CloseHandle(launch_result.crash_info_shmem_handle);
+
if (PP_ToBool(main_service_runtime)) {
load_manager->ReportLoadError(PP_NACL_ERROR_SEL_LDR_LAUNCH,
"ServiceRuntime: failed to start",
@@ -483,7 +488,7 @@ void LaunchSelLdr(PP_Instance instance,
static_cast<int32_t>(PP_ERROR_FAILED)));
return;
}
- result_socket = launch_result.imc_channel_handle;
+
instance_info.channel_handle = launch_result.ppapi_ipc_channel_handle;
instance_info.plugin_pid = launch_result.plugin_pid;
instance_info.plugin_child_id = launch_result.plugin_child_id;
@@ -494,7 +499,9 @@ void LaunchSelLdr(PP_Instance instance,
nacl_plugin_instance->instance_info.reset(new InstanceInfo(instance_info));
}
- *(static_cast<NaClHandle*>(imc_handle)) = ToNativeHandle(result_socket);
+ *(static_cast<NaClHandle*>(imc_handle)) =
+ IPC::PlatformFileForTransitToPlatformFile(
+ launch_result.imc_channel_handle);
// Store the crash information shared memory handle.
load_manager->set_crash_info_shmem_handle(
« components/nacl/browser/nacl_process_host.cc ('K') | « components/nacl/common/nacl_types.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698