summaryrefslogtreecommitdiffstats
path: root/chrome/common/ipc_channel_posix.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/common/ipc_channel_posix.cc')
-rw-r--r--chrome/common/ipc_channel_posix.cc109
1 files changed, 51 insertions, 58 deletions
diff --git a/chrome/common/ipc_channel_posix.cc b/chrome/common/ipc_channel_posix.cc
index 83f1ed4..522a6bc 100644
--- a/chrome/common/ipc_channel_posix.cc
+++ b/chrome/common/ipc_channel_posix.cc
@@ -16,6 +16,7 @@
#include <map>
#include "base/command_line.h"
+#include "base/eintr_wrapper.h"
#include "base/lock.h"
#include "base/logging.h"
#include "base/process_util.h"
@@ -139,7 +140,7 @@ bool CreateServerFifo(const std::string &pipe_name, int* server_listen_fd) {
// Make socket non-blocking
if (fcntl(fd, F_SETFL, O_NONBLOCK) == -1) {
- close(fd);
+ HANDLE_EINTR(close(fd));
return false;
}
@@ -157,14 +158,14 @@ bool CreateServerFifo(const std::string &pipe_name, int* server_listen_fd) {
// Bind the socket.
if (bind(fd, reinterpret_cast<const sockaddr*>(&unix_addr),
unix_addr_len) != 0) {
- close(fd);
+ HANDLE_EINTR(close(fd));
return false;
}
// Start listening on the socket.
const int listen_queue_length = 1;
if (listen(fd, listen_queue_length) != 0) {
- close(fd);
+ HANDLE_EINTR(close(fd));
return false;
}
@@ -176,11 +177,11 @@ bool CreateServerFifo(const std::string &pipe_name, int* server_listen_fd) {
bool ServerAcceptFifoConnection(int server_listen_fd, int* server_socket) {
DCHECK(server_socket);
- int accept_fd = accept(server_listen_fd, NULL, 0);
+ int accept_fd = HANDLE_EINTR(accept(server_listen_fd, NULL, 0));
if (accept_fd < 0)
return false;
if (fcntl(accept_fd, F_SETFL, O_NONBLOCK) == -1) {
- close(accept_fd);
+ HANDLE_EINTR(close(accept_fd));
return false;
}
@@ -202,7 +203,7 @@ bool ClientConnectToFifo(const std::string &pipe_name, int* client_socket) {
// Make socket non-blocking
if (fcntl(fd, F_SETFL, O_NONBLOCK) == -1) {
LOG(ERROR) << "fcntl failed";
- close(fd);
+ HANDLE_EINTR(close(fd));
return false;
}
@@ -215,13 +216,9 @@ bool ClientConnectToFifo(const std::string &pipe_name, int* client_socket) {
size_t server_unix_addr_len = offsetof(struct sockaddr_un, sun_path) +
strlen(server_unix_addr.sun_path) + 1;
- int ret_val = -1;
- do {
- ret_val = connect(fd, reinterpret_cast<sockaddr*>(&server_unix_addr),
- server_unix_addr_len);
- } while (ret_val == -1 && errno == EINTR);
- if (ret_val != 0) {
- close(fd);
+ if (HANDLE_EINTR(connect(fd, reinterpret_cast<sockaddr*>(&server_unix_addr),
+ server_unix_addr_len)) != 0) {
+ HANDLE_EINTR(close(fd));
return false;
}
@@ -290,8 +287,8 @@ bool Channel::ChannelImpl::CreatePipe(const std::wstring& channel_id,
// Set both ends to be non-blocking.
if (fcntl(pipe_fds[0], F_SETFL, O_NONBLOCK) == -1 ||
fcntl(pipe_fds[1], F_SETFL, O_NONBLOCK) == -1) {
- close(pipe_fds[0]);
- close(pipe_fds[1]);
+ HANDLE_EINTR(close(pipe_fds[0]));
+ HANDLE_EINTR(close(pipe_fds[1]));
return false;
}
pipe_ = pipe_fds[0];
@@ -367,9 +364,7 @@ bool Channel::ChannelImpl::ProcessIncomingMessages() {
// Read from pipe.
// recvmsg() returns 0 if the connection has closed or EAGAIN if no data
// is waiting on the pipe.
- do {
- bytes_read = recvmsg(pipe_, &msg, MSG_DONTWAIT);
- } while (bytes_read == -1 && errno == EINTR);
+ bytes_read = HANDLE_EINTR(recvmsg(pipe_, &msg, MSG_DONTWAIT));
if (bytes_read < 0) {
if (errno == EAGAIN) {
@@ -388,7 +383,7 @@ bool Channel::ChannelImpl::ProcessIncomingMessages() {
if (client_pipe_ != -1) {
Singleton<PipeMap>()->Remove(pipe_name_);
- close(client_pipe_);
+ HANDLE_EINTR(close(client_pipe_));
client_pipe_ = -1;
}
@@ -427,7 +422,7 @@ bool Channel::ChannelImpl::ProcessIncomingMessages() {
<< " cmsg_len:" << cmsg->cmsg_len
<< " fd:" << pipe_;
for (unsigned i = 0; i < num_wire_fds; ++i)
- close(wire_fds[i]);
+ HANDLE_EINTR(close(wire_fds[i]));
return false;
}
break;
@@ -500,7 +495,7 @@ bool Channel::ChannelImpl::ProcessIncomingMessages() {
<< " fds_i:" << fds_i;
// close the existing file descriptors so that we don't leak them
for (unsigned i = fds_i; i < num_fds; ++i)
- close(fds[i]);
+ HANDLE_EINTR(close(fds[i]));
input_overflow_fds_.clear();
// abort the connection
return false;
@@ -564,40 +559,38 @@ bool Channel::ChannelImpl::ProcessOutgoingMessages() {
DCHECK(amt_to_write != 0);
const char *out_bytes = reinterpret_cast<const char*>(msg->data()) +
message_send_bytes_written_;
- ssize_t bytes_written = -1;
- do {
- struct msghdr msgh = {0};
- struct iovec iov = {const_cast<char*>(out_bytes), amt_to_write};
- msgh.msg_iov = &iov;
- msgh.msg_iovlen = 1;
- char buf[CMSG_SPACE(
- sizeof(int[FileDescriptorSet::MAX_DESCRIPTORS_PER_MESSAGE]))];
-
- if (message_send_bytes_written_ == 0 &&
- !msg->file_descriptor_set()->empty()) {
- // This is the first chunk of a message which has descriptors to send
- struct cmsghdr *cmsg;
- const unsigned num_fds = msg->file_descriptor_set()->size();
-
- DCHECK_LE(num_fds, FileDescriptorSet::MAX_DESCRIPTORS_PER_MESSAGE);
-
- msgh.msg_control = buf;
- msgh.msg_controllen = CMSG_SPACE(sizeof(int) * num_fds);
- cmsg = CMSG_FIRSTHDR(&msgh);
- cmsg->cmsg_level = SOL_SOCKET;
- cmsg->cmsg_type = SCM_RIGHTS;
- cmsg->cmsg_len = CMSG_LEN(sizeof(int) * num_fds);
- msg->file_descriptor_set()->GetDescriptors(
- reinterpret_cast<int*>(CMSG_DATA(cmsg)));
- msgh.msg_controllen = cmsg->cmsg_len;
-
- msg->header()->num_fds = num_fds;
- }
- bytes_written = sendmsg(pipe_, &msgh, MSG_DONTWAIT);
- if (bytes_written > 0)
- msg->file_descriptor_set()->CommitAll();
- } while (bytes_written == -1 && errno == EINTR);
+ struct msghdr msgh = {0};
+ struct iovec iov = {const_cast<char*>(out_bytes), amt_to_write};
+ msgh.msg_iov = &iov;
+ msgh.msg_iovlen = 1;
+ char buf[CMSG_SPACE(
+ sizeof(int[FileDescriptorSet::MAX_DESCRIPTORS_PER_MESSAGE]))];
+
+ if (message_send_bytes_written_ == 0 &&
+ !msg->file_descriptor_set()->empty()) {
+ // This is the first chunk of a message which has descriptors to send
+ struct cmsghdr *cmsg;
+ const unsigned num_fds = msg->file_descriptor_set()->size();
+
+ DCHECK_LE(num_fds, FileDescriptorSet::MAX_DESCRIPTORS_PER_MESSAGE);
+
+ msgh.msg_control = buf;
+ msgh.msg_controllen = CMSG_SPACE(sizeof(int) * num_fds);
+ cmsg = CMSG_FIRSTHDR(&msgh);
+ cmsg->cmsg_level = SOL_SOCKET;
+ cmsg->cmsg_type = SCM_RIGHTS;
+ cmsg->cmsg_len = CMSG_LEN(sizeof(int) * num_fds);
+ msg->file_descriptor_set()->GetDescriptors(
+ reinterpret_cast<int*>(CMSG_DATA(cmsg)));
+ msgh.msg_controllen = cmsg->cmsg_len;
+
+ msg->header()->num_fds = num_fds;
+ }
+
+ ssize_t bytes_written = HANDLE_EINTR(sendmsg(pipe_, &msgh, MSG_DONTWAIT));
+ if (bytes_written > 0)
+ msg->file_descriptor_set()->CommitAll();
if (bytes_written < 0 && errno != EAGAIN) {
LOG(ERROR) << "pipe error: " << strerror(errno);
@@ -731,7 +724,7 @@ void Channel::ChannelImpl::Close() {
server_listen_connection_watcher_.StopWatchingFileDescriptor();
if (server_listen_pipe_ != -1) {
- close(server_listen_pipe_);
+ HANDLE_EINTR(close(server_listen_pipe_));
server_listen_pipe_ = -1;
}
@@ -739,12 +732,12 @@ void Channel::ChannelImpl::Close() {
read_watcher_.StopWatchingFileDescriptor();
write_watcher_.StopWatchingFileDescriptor();
if (pipe_ != -1) {
- close(pipe_);
+ HANDLE_EINTR(close(pipe_));
pipe_ = -1;
}
if (client_pipe_ != -1) {
Singleton<PipeMap>()->Remove(pipe_name_);
- close(client_pipe_);
+ HANDLE_EINTR(close(client_pipe_));
client_pipe_ = -1;
}
@@ -760,7 +753,7 @@ void Channel::ChannelImpl::Close() {
// Close any outstanding, received file descriptors
for (std::vector<int>::iterator
i = input_overflow_fds_.begin(); i != input_overflow_fds_.end(); ++i) {
- close(*i);
+ HANDLE_EINTR(close(*i));
}
input_overflow_fds_.clear();
}