| Index: chrome/nacl/nacl_ipc_adapter.cc
|
| ===================================================================
|
| --- chrome/nacl/nacl_ipc_adapter.cc (revision 154143)
|
| +++ chrome/nacl/nacl_ipc_adapter.cc (working copy)
|
| @@ -89,9 +89,9 @@
|
| delete channel;
|
| }
|
|
|
| -void WriteFileDescriptor(int handle_index,
|
| - const ppapi::proxy::SerializedHandle& handle,
|
| - IPC::Message* message) {
|
| +void WriteHandle(int handle_index,
|
| + const ppapi::proxy::SerializedHandle& handle,
|
| + IPC::Message* message) {
|
| ppapi::proxy::SerializedHandle::WriteHeader(handle.header(), message);
|
|
|
| // Now write the handle itself in POSIX style.
|
| @@ -108,7 +108,7 @@
|
| Handles* handles, IPC::Message* msg, int* handle_index) {
|
| handles->push_back(handle);
|
| if (msg)
|
| - WriteFileDescriptor((*handle_index)++, handle, msg);
|
| + WriteHandle((*handle_index)++, handle, msg);
|
| }
|
|
|
| // This overload is to catch all types other than SerializedHandle. On Windows,
|
| @@ -434,6 +434,7 @@
|
| return false; \
|
| break; \
|
| }
|
| +
|
| bool NaClIPCAdapter::OnMessageReceived(const IPC::Message& msg) {
|
| {
|
| base::AutoLock lock(lock_);
|
| @@ -443,12 +444,21 @@
|
| // Pointer to the "new" message we will rewrite on Windows. On posix, this
|
| // isn't necessary, so it will stay NULL.
|
| IPC::Message* new_msg_ptr = NULL;
|
| + IPC::Message new_msg(msg.routing_id(), msg.type(), msg.priority());
|
| #if defined(OS_WIN)
|
| - IPC::Message new_msg(msg.routing_id(), msg.type(), msg.priority());
|
| new_msg_ptr = &new_msg;
|
| +#else
|
| + // Even on POSIX, we have to rewrite messages to create channels, because
|
| + // these contain a handle with an invalid (place holder) descriptor. The
|
| + // message sending code sees this and doesn't pass the descriptor over
|
| + // correctly.
|
| + if (msg.type() == PpapiMsg_CreateNaClChannel::ID)
|
| + new_msg_ptr = &new_msg;
|
| #endif
|
| +
|
| Handles handles;
|
| switch (msg.type()) {
|
| + CASE_FOR_MESSAGE(PpapiMsg_CreateNaClChannel)
|
| CASE_FOR_MESSAGE(PpapiMsg_PPBAudio_NotifyAudioStreamCreated)
|
| CASE_FOR_MESSAGE(PpapiMsg_PPBAudioInput_OpenACK)
|
| case IPC_REPLY_ID: {
|
| @@ -502,10 +512,33 @@
|
| iter->descriptor().fd
|
| #endif
|
| ));
|
| + break;
|
| }
|
| + case ppapi::proxy::SerializedHandle::CHANNEL_HANDLE: {
|
| + // Check that this came from a PpapiMsg_CreateNaClChannel message.
|
| + // This code here is only appropriate for that message.
|
| + DCHECK(msg.type() == PpapiMsg_CreateNaClChannel::ID);
|
| + IPC::ChannelHandle channel_handle =
|
| + IPC::Channel::GenerateVerifiedChannelID("nacl");
|
| + scoped_refptr<NaClIPCAdapter> ipc_adapter(
|
| + new NaClIPCAdapter(channel_handle, task_runner_));
|
| +#if defined(OS_POSIX)
|
| + channel_handle.socket = base::FileDescriptor(
|
| + ipc_adapter->TakeClientFileDescriptor(), true);
|
| +#endif
|
| + nacl_desc.reset(factory.MakeGeneric(ipc_adapter->MakeNaClDesc()));
|
| + // Send back a message that the channel was created.
|
| + scoped_ptr<IPC::Message> response(
|
| + new PpapiHostMsg_ChannelCreated(channel_handle));
|
| + task_runner_->PostTask(FROM_HERE,
|
| + base::Bind(&NaClIPCAdapter::SendMessageOnIOThread, this,
|
| + base::Passed(&response)));
|
| + break;
|
| + }
|
| case ppapi::proxy::SerializedHandle::INVALID: {
|
| // Nothing to do. TODO(dmichael): Should we log this? Or is it
|
| // sometimes okay to pass an INVALID handle?
|
| + break;
|
| }
|
| // No default, so the compiler will warn us if new types get added.
|
| }
|
|
|