| OLD | NEW |
| 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 1125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1136 return false; | 1136 return false; |
| 1137 } | 1137 } |
| 1138 if (debug_exception_handler_requested_) { | 1138 if (debug_exception_handler_requested_) { |
| 1139 // The NaCl process should not request this multiple times. | 1139 // The NaCl process should not request this multiple times. |
| 1140 DLOG(ERROR) << "Multiple AttachDebugExceptionHandler requests received"; | 1140 DLOG(ERROR) << "Multiple AttachDebugExceptionHandler requests received"; |
| 1141 return false; | 1141 return false; |
| 1142 } | 1142 } |
| 1143 debug_exception_handler_requested_ = true; | 1143 debug_exception_handler_requested_ = true; |
| 1144 | 1144 |
| 1145 base::ProcessId nacl_pid = base::GetProcId(process_->GetData().handle); | 1145 base::ProcessId nacl_pid = base::GetProcId(process_->GetData().handle); |
| 1146 base::ProcessHandle temp_handle; | |
| 1147 // We cannot use process_->GetData().handle because it does not have | 1146 // We cannot use process_->GetData().handle because it does not have |
| 1148 // the necessary access rights. We open the new handle here rather | 1147 // the necessary access rights. We open the new handle here rather |
| 1149 // than in the NaCl broker process in case the NaCl loader process | 1148 // than in the NaCl broker process in case the NaCl loader process |
| 1150 // dies before the NaCl broker process receives the message we send. | 1149 // dies before the NaCl broker process receives the message we send. |
| 1151 // The debug exception handler uses DebugActiveProcess() to attach, | 1150 // The debug exception handler uses DebugActiveProcess() to attach, |
| 1152 // but this takes a PID. We need to prevent the NaCl loader's PID | 1151 // but this takes a PID. We need to prevent the NaCl loader's PID |
| 1153 // from being reused before DebugActiveProcess() is called, and | 1152 // from being reused before DebugActiveProcess() is called, and |
| 1154 // holding a process handle open achieves this. | 1153 // holding a process handle open achieves this. |
| 1155 if (!base::OpenProcessHandleWithAccess( | 1154 base::Process process = |
| 1156 nacl_pid, | 1155 base::Process::OpenWithAccess(nacl_pid, |
| 1157 base::kProcessAccessQueryInformation | | 1156 PROCESS_QUERY_INFORMATION | |
| 1158 base::kProcessAccessSuspendResume | | 1157 PROCESS_SUSPEND_RESUME | |
| 1159 base::kProcessAccessTerminate | | 1158 PROCESS_TERMINATE | |
| 1160 base::kProcessAccessVMOperation | | 1159 PROCESS_VM_OPERATION | |
| 1161 base::kProcessAccessVMRead | | 1160 PROCESS_VM_READ | |
| 1162 base::kProcessAccessVMWrite | | 1161 PROCESS_VM_WRITE | |
| 1163 base::kProcessAccessDuplicateHandle | | 1162 PROCESS_DUP_HANDLE | |
| 1164 base::kProcessAccessWaitForTermination, | 1163 SYNCHRONIZE); |
| 1165 &temp_handle)) { | 1164 if (!process.IsValid()) { |
| 1166 LOG(ERROR) << "Failed to get process handle"; | 1165 LOG(ERROR) << "Failed to get process handle"; |
| 1167 return false; | 1166 return false; |
| 1168 } | 1167 } |
| 1169 base::win::ScopedHandle process_handle(temp_handle); | |
| 1170 | 1168 |
| 1171 attach_debug_exception_handler_reply_msg_.reset(reply_msg); | 1169 attach_debug_exception_handler_reply_msg_.reset(reply_msg); |
| 1172 // If the NaCl loader is 64-bit, the process running its debug | 1170 // If the NaCl loader is 64-bit, the process running its debug |
| 1173 // exception handler must be 64-bit too, so we use the 64-bit NaCl | 1171 // exception handler must be 64-bit too, so we use the 64-bit NaCl |
| 1174 // broker process for this. Otherwise, on a 32-bit system, we use | 1172 // broker process for this. Otherwise, on a 32-bit system, we use |
| 1175 // the 32-bit browser process to run the debug exception handler. | 1173 // the 32-bit browser process to run the debug exception handler. |
| 1176 if (RunningOnWOW64()) { | 1174 if (RunningOnWOW64()) { |
| 1177 return NaClBrokerService::GetInstance()->LaunchDebugExceptionHandler( | 1175 return NaClBrokerService::GetInstance()->LaunchDebugExceptionHandler( |
| 1178 weak_factory_.GetWeakPtr(), nacl_pid, process_handle.Get(), | 1176 weak_factory_.GetWeakPtr(), nacl_pid, process.Handle(), |
| 1179 info); | 1177 info); |
| 1180 } else { | 1178 } else { |
| 1181 NaClStartDebugExceptionHandlerThread( | 1179 NaClStartDebugExceptionHandlerThread( |
| 1182 process_handle.Take(), info, | 1180 process.Pass(), info, |
| 1183 base::MessageLoopProxy::current(), | 1181 base::MessageLoopProxy::current(), |
| 1184 base::Bind(&NaClProcessHost::OnDebugExceptionHandlerLaunchedByBroker, | 1182 base::Bind(&NaClProcessHost::OnDebugExceptionHandlerLaunchedByBroker, |
| 1185 weak_factory_.GetWeakPtr())); | 1183 weak_factory_.GetWeakPtr())); |
| 1186 return true; | 1184 return true; |
| 1187 } | 1185 } |
| 1188 } | 1186 } |
| 1189 #endif | 1187 #endif |
| 1190 | 1188 |
| 1191 } // namespace nacl | 1189 } // namespace nacl |
| OLD | NEW |