Index: ipc/ipc_channel_posix.cc |
diff --git a/ipc/ipc_channel_posix.cc b/ipc/ipc_channel_posix.cc |
index 2dfd17e6730cbd305d7a2046def6d90276dea172..eaf5e911d8a13fa2f128bc31f61e53ba006db4cd 100644 |
--- a/ipc/ipc_channel_posix.cc |
+++ b/ipc/ipc_channel_posix.cc |
@@ -10,13 +10,16 @@ |
#include <sys/socket.h> |
#include <sys/stat.h> |
#include <sys/types.h> |
-#include <sys/un.h> |
#include <unistd.h> |
#if defined(OS_OPENBSD) |
#include <sys/uio.h> |
#endif |
+#if !defined(__native_client_nonsfi__) |
+#include <sys/un.h> |
+#endif |
+ |
#include <map> |
#include <string> |
@@ -173,9 +176,9 @@ void Channel::NotifyProcessForkedForTesting() { |
//------------------------------------------------------------------------------ |
-#if defined(OS_LINUX) |
+#if defined(OS_LINUX) || defined(__native_client_nonsfi__) |
int ChannelPosix::global_pid_ = 0; |
-#endif // OS_LINUX |
+#endif |
ChannelPosix::ChannelPosix(const IPC::ChannelHandle& channel_handle, |
Mode mode, Listener* listener) |
@@ -255,6 +258,11 @@ bool ChannelPosix::CreatePipe( |
} |
#endif // IPC_USES_READWRITE |
} else if (mode_ & MODE_NAMED_FLAG) { |
+#if defined(__native_client_nonsfi__) |
+ // IPC channels in nacl_helper_nonsfi should not be NAMED mode. |
+ NOTREACHED(); |
+ return false; |
+#else |
// Case 2 from comment above. |
int local_pipe_fd = -1; |
@@ -276,6 +284,7 @@ bool ChannelPosix::CreatePipe( |
} |
local_pipe.reset(local_pipe_fd); |
+#endif // !defined(__native_client_nonsfi__) |
} else { |
local_pipe.reset(PipeMap::GetInstance()->Lookup(pipe_name_)); |
if (mode_ & MODE_CLIENT_FLAG) { |
@@ -336,10 +345,16 @@ bool ChannelPosix::CreatePipe( |
} |
#endif // IPC_USES_READWRITE |
- if ((mode_ & MODE_SERVER_FLAG) && (mode_ & MODE_NAMED_FLAG)) |
+ if ((mode_ & MODE_SERVER_FLAG) && (mode_ & MODE_NAMED_FLAG)) { |
+#if defined(__native_client_nonsfi__) |
+ // IPC channels in nacl_helper_nonsfi should not be NAMED mode. |
hamaji
2014/10/20 06:37:41
not be either SERVER mode nor NAMED mode?
hidehiko
2014/10/20 09:25:29
Done.
|
+ NOTREACHED(); |
+#else |
server_listen_pipe_.reset(local_pipe.release()); |
- else |
+#endif |
+ } else { |
pipe_.reset(local_pipe.release()); |
+ } |
return true; |
} |
@@ -351,6 +366,10 @@ bool ChannelPosix::Connect() { |
bool did_connect = true; |
if (server_listen_pipe_.is_valid()) { |
+#if defined(__native_client_nonsfi__) |
+ // IPC channels in nacl_helper_nonsfi should always be client mode. |
+ NOTREACHED(); |
+#else |
// Watch the pipe for connections, and turn any connections into |
// active sockets. |
base::MessageLoopForIO::current()->WatchFileDescriptor( |
@@ -359,6 +378,7 @@ bool ChannelPosix::Connect() { |
base::MessageLoopForIO::WATCH_READ, |
&server_listen_connection_watcher_, |
this); |
+#endif |
} else { |
did_connect = AcceptConnection(); |
} |
@@ -581,10 +601,13 @@ bool ChannelPosix::HasAcceptedConnection() const { |
return AcceptsConnections() && pipe_.is_valid(); |
} |
+#if !defined(__native_client_nonsfi__) |
+// GetPeerEuid is not supported in nacl_helper_nonsfi. |
bool ChannelPosix::GetPeerEuid(uid_t* peer_euid) const { |
DCHECK(!(mode_ & MODE_SERVER) || HasAcceptedConnection()); |
return IPC::GetPeerEuid(pipe_.get(), peer_euid); |
} |
+#endif |
void ChannelPosix::ResetToAcceptingConnectionState() { |
// Unregister libevent for the unix domain socket and close it. |
@@ -623,16 +646,20 @@ bool ChannelPosix::IsNamedServerInitialized( |
return base::PathExists(base::FilePath(channel_id)); |
} |
-#if defined(OS_LINUX) |
+#if defined(OS_LINUX) || defined(__native_client_nonsfi__) |
// static |
void ChannelPosix::SetGlobalPid(int pid) { |
global_pid_ = pid; |
} |
-#endif // OS_LINUX |
+#endif |
// Called by libevent when we can read from the pipe without blocking. |
void ChannelPosix::OnFileCanReadWithoutBlocking(int fd) { |
if (fd == server_listen_pipe_.get()) { |
+#if defined(__native_client_nonsfi__) |
+ // IPC channels in nacl_helper_nonsfi should not be SERVER mode. |
+ NOTREACHED(); |
+#else |
int new_pipe = 0; |
if (!ServerAcceptConnection(server_listen_pipe_.get(), &new_pipe) || |
new_pipe < 0) { |
@@ -671,6 +698,7 @@ void ChannelPosix::OnFileCanReadWithoutBlocking(int fd) { |
NOTREACHED() << "AcceptConnection should not fail on server"; |
} |
waiting_connect_ = false; |
+#endif |
} else if (fd == pipe_) { |
if (waiting_connect_ && (mode_ & MODE_SERVER_FLAG)) { |
waiting_connect_ = false; |
@@ -744,12 +772,14 @@ void ChannelPosix::ClosePipeOnError() { |
} |
int ChannelPosix::GetHelloMessageProcId() const { |
- int pid = base::GetCurrentProcId(); |
-#if defined(OS_LINUX) |
+#if defined(OS_LINUX) || defined(__native_client_nonsfi__) |
// Our process may be in a sandbox with a separate PID namespace. |
- if (global_pid_) { |
- pid = global_pid_; |
- } |
+ // In nacl_helper_nonsfi, if sandbox is enabled, our process should be always |
+ // in the sandbox. In such a situation, calling GetCurrentProcId() would hit |
hamaji
2014/10/20 06:37:41
How about adding "unless --no-sandbox is specified
hidehiko
2014/10/20 09:25:29
Slightly refactored. How about this?
|
+ // the sandbox restriction. |
+ int pid = global_pid_ ? global_pid_ : base::GetCurrentProcId(); |
+#else |
+ int pid = base::GetCurrentProcId(); |
#endif |
return pid; |
} |
@@ -923,11 +953,15 @@ bool ChannelPosix::ExtractFileDescriptorsFromMsghdr(msghdr* msg) { |
file_descriptors, |
file_descriptors + num_file_descriptors); |
+#if !defined(__native_client_nonsfi__) |
+ // The PNaCl toolchain for Non-SFI binary build does not support |
+ // MSG_CTRUNC. |
// Check this after adding the FDs so we don't leak them. |
if (msg->msg_flags & MSG_CTRUNC) { |
ClearInputFDs(); |
return false; |
} |
+#endif |
return true; |
} |
@@ -1032,9 +1066,14 @@ void ChannelPosix::Close() { |
} |
if (server_listen_pipe_.is_valid()) { |
+#if defined(__native_client_nonsfi__) |
+ // IPC channels in nacl_helper_nonsfi should not be SERVER mode. |
+ NOTREACHED(); |
+#else |
server_listen_pipe_.reset(); |
// Unregister libevent for the listening socket and close it. |
server_listen_connection_watcher_.StopWatchingFileDescriptor(); |
+#endif |
} |
CloseClientFileDescriptor(); |
@@ -1075,11 +1114,11 @@ bool Channel::IsNamedServerInitialized( |
return ChannelPosix::IsNamedServerInitialized(channel_id); |
} |
-#if defined(OS_LINUX) |
+#if defined(OS_LINUX) || defined(__native_client_nonsfi__) |
// static |
void Channel::SetGlobalPid(int pid) { |
ChannelPosix::SetGlobalPid(pid); |
} |
-#endif // OS_LINUX |
+#endif |
} // namespace IPC |