Show more different NaCl loading errors.
Also refactor NaCl launch message to pass output parameters in a single
structure.
I changed nacl::FileDescriptor type on Windows from int to HANDLE to make it
compatible with IPC::PlatformFileForTransit. The only ways nacl::FileDescriptor
is currently used are its initialization, passing in IPC message and in
nacl::ToNativeHandle function. The behaviour of nacl::ToNativeHandle haven't
changed. IPC doesn't have special handling for integers and it only truncates
HANDLEs to 32-bit (so that they can be passed between 32-bit and 64-bit
processes) on Windows. So the change shouldn't affect any existing users of
nacl::FileDescriptor type.
TEST= bots + changing code to produce an error on normal code path
BUG= 259333
Review URL: https://chromiumcodereview.appspot.com/18045007
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@212913 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/chrome/browser/nacl_host/nacl_process_host.cc b/chrome/browser/nacl_host/nacl_process_host.cc
index 2316856..ee67c58 100644
--- a/chrome/browser/nacl_host/nacl_process_host.cc
+++ b/chrome/browser/nacl_host/nacl_process_host.cc
@@ -289,8 +289,8 @@
NaClBrowser* nacl_browser = NaClBrowser::GetInstance();
nacl_browser->EnsureAllResourcesAvailable();
if (!nacl_browser->IsOk()) {
- LOG(ERROR) << "NaCl process launch failed: could not find all the "
- "resources needed to launch the process";
+ SendErrorToRenderer("could not find all the resources needed"
+ " to launch the process");
delete this;
return;
}
@@ -307,7 +307,7 @@
NaClHandle pair[2];
// Create a connected socket
if (NaClSocketPair(pair) == -1) {
- LOG(ERROR) << "NaCl process launch failed: could not create a socket pair";
+ SendErrorToRenderer("NaClSocketPair() failed");
delete this;
return;
}
@@ -393,7 +393,7 @@
bool NaClProcessHost::LaunchSelLdr() {
std::string channel_id = process_->GetHost()->CreateChannel();
if (channel_id.empty()) {
- LOG(ERROR) << "NaCl process launch failed: could not create channel";
+ SendErrorToRenderer("CreateChannel() failed");
return false;
}
@@ -428,6 +428,7 @@
// On Windows 64-bit NaCl loader is called nacl64.exe instead of chrome.exe
if (RunningOnWOW64()) {
if (!NaClBrowser::GetInstance()->GetNaCl64ExePath(&exe_path)) {
+ SendErrorToRenderer("could not get path to nacl64.exe");
return false;
}
}
@@ -450,8 +451,7 @@
if (RunningOnWOW64()) {
if (!NaClBrokerService::GetInstance()->LaunchLoader(
weak_factory_.GetWeakPtr(), channel_id)) {
- LOG(ERROR) << "NaCl process launch failed: broker service did not launch "
- "process";
+ SendErrorToRenderer("broker service did not launch process");
return false;
}
} else {
@@ -496,8 +496,7 @@
void NaClProcessHost::OnResourcesReady() {
NaClBrowser* nacl_browser = NaClBrowser::GetInstance();
if (!nacl_browser->IsReady()) {
- LOG(ERROR) << "NaCl process launch failed: could not acquire shared "
- "resources needed by NaCl";
+ SendErrorToRenderer("could not acquire shared resources needed by NaCl");
delete this;
} else if (!SendStart()) {
delete this;
@@ -514,7 +513,7 @@
// BrokerDuplicateHandle().
if (RunningOnWOW64()) {
if (!content::BrokerAddTargetPeer(process_->GetData().handle)) {
- LOG(ERROR) << "Failed to add NaCl process PID";
+ SendErrorToRenderer("BrokerAddTargetPeer() failed");
return false;
}
}
@@ -532,7 +531,7 @@
0, // Unused given DUPLICATE_SAME_ACCESS.
FALSE,
DUPLICATE_CLOSE_SOURCE | DUPLICATE_SAME_ACCESS)) {
- LOG(ERROR) << "DuplicateHandle() failed";
+ SendErrorToRenderer("DuplicateHandle() failed");
return false;
}
handle_for_renderer = reinterpret_cast<nacl::FileDescriptor>(
@@ -547,16 +546,35 @@
#endif
const ChildProcessData& data = process_->GetData();
- NaClHostMsg_LaunchNaCl::WriteReplyParams(
- reply_msg_, handle_for_renderer,
- channel_handle, base::GetProcId(data.handle), data.id);
- nacl_host_message_filter_->Send(reply_msg_);
- nacl_host_message_filter_ = NULL;
- reply_msg_ = NULL;
+ SendMessageToRenderer(
+ nacl::NaClLaunchResult(handle_for_renderer,
+ channel_handle,
+ base::GetProcId(data.handle),
+ data.id),
+ std::string() /* error_message */);
internal_->socket_for_renderer = NACL_INVALID_HANDLE;
return true;
}
+void NaClProcessHost::SendErrorToRenderer(const std::string& error_message) {
+ LOG(ERROR) << "NaCl process launch failed: " << error_message;
+ SendMessageToRenderer(nacl::NaClLaunchResult(), error_message);
+}
+
+void NaClProcessHost::SendMessageToRenderer(
+ const nacl::NaClLaunchResult& result,
+ const std::string& error_message) {
+ DCHECK(nacl_host_message_filter_);
+ DCHECK(reply_msg_);
+ if (nacl_host_message_filter_ != NULL && reply_msg_ != NULL) {
+ NaClHostMsg_LaunchNaCl::WriteReplyParams(
+ reply_msg_, result, error_message);
+ nacl_host_message_filter_->Send(reply_msg_);
+ nacl_host_message_filter_ = NULL;
+ reply_msg_ = NULL;
+ }
+}
+
// TCP port we chose for NaCl debug stub. It can be any other number.
static const int kDebugStubPort = 4014;
@@ -755,8 +773,7 @@
weak_factory_.GetWeakPtr()));
return true;
} else {
- LOG(ERROR) << "NaCl process failed to launch: previously failed to acquire "
- "shared resources";
+ SendErrorToRenderer("previously failed to acquire shared resources");
return false;
}
}