Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(406)

Side by Side Diff: ipc/ipc_channel_posix.cc

Issue 7712022: This patch caused Chrome to be unable to load any web pages on Chrome OS. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 9 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « ipc/ipc_channel_posix.h ('k') | ipc/ipc_channel_proxy.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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 "ipc/ipc_channel_posix.h" 5 #include "ipc/ipc_channel_posix.h"
6 6
7 #include <errno.h> 7 #include <errno.h>
8 #include <fcntl.h> 8 #include <fcntl.h>
9 #include <stddef.h> 9 #include <stddef.h>
10 #include <sys/types.h> 10 #include <sys/types.h>
(...skipping 291 matching lines...) Expand 10 before | Expand all | Expand 10 after
302 message_send_bytes_written_(0), 302 message_send_bytes_written_(0),
303 server_listen_pipe_(-1), 303 server_listen_pipe_(-1),
304 pipe_(-1), 304 pipe_(-1),
305 client_pipe_(-1), 305 client_pipe_(-1),
306 #if defined(IPC_USES_READWRITE) 306 #if defined(IPC_USES_READWRITE)
307 fd_pipe_(-1), 307 fd_pipe_(-1),
308 remote_fd_pipe_(-1), 308 remote_fd_pipe_(-1),
309 #endif // IPC_USES_READWRITE 309 #endif // IPC_USES_READWRITE
310 pipe_name_(channel_handle.name), 310 pipe_name_(channel_handle.name),
311 listener_(listener), 311 listener_(listener),
312 must_unlink_(false), 312 must_unlink_(false) {
313 needs_override_peer_pid_(false),
314 override_peer_pid_(0) {
315 memset(input_buf_, 0, sizeof(input_buf_)); 313 memset(input_buf_, 0, sizeof(input_buf_));
316 memset(input_cmsg_buf_, 0, sizeof(input_cmsg_buf_)); 314 memset(input_cmsg_buf_, 0, sizeof(input_cmsg_buf_));
317 if (!CreatePipe(channel_handle)) { 315 if (!CreatePipe(channel_handle)) {
318 // The pipe may have been closed already. 316 // The pipe may have been closed already.
319 const char *modestr = (mode_ & MODE_SERVER_FLAG) ? "server" : "client"; 317 const char *modestr = (mode_ & MODE_SERVER_FLAG) ? "server" : "client";
320 // The pipe may have been closed already. 318 // The pipe may have been closed already.
321 LOG(WARNING) << "Unable to create pipe named \"" << channel_handle.name 319 LOG(WARNING) << "Unable to create pipe named \"" << channel_handle.name
322 << "\" in " << modestr << " mode"; 320 << "\" in " << modestr << " mode";
323 } 321 }
324 } 322 }
(...skipping 397 matching lines...) Expand 10 before | Expand all | Expand 10 after
722 // subsequent file descriptor passing. 720 // subsequent file descriptor passing.
723 DCHECK_EQ(m.file_descriptor_set()->size(), 1U); 721 DCHECK_EQ(m.file_descriptor_set()->size(), 1U);
724 base::FileDescriptor descriptor; 722 base::FileDescriptor descriptor;
725 if (!m.ReadFileDescriptor(&iter, &descriptor)) { 723 if (!m.ReadFileDescriptor(&iter, &descriptor)) {
726 NOTREACHED(); 724 NOTREACHED();
727 } 725 }
728 fd_pipe_ = descriptor.fd; 726 fd_pipe_ = descriptor.fd;
729 CHECK(descriptor.auto_close); 727 CHECK(descriptor.auto_close);
730 } 728 }
731 #endif // IPC_USES_READWRITE 729 #endif // IPC_USES_READWRITE
732 if (needs_override_peer_pid_) { 730 listener_->OnChannelConnected(pid);
733 // If we already have the peer PID, use it. Otherwise we'll call
734 // OnChannelConnected() in OverridePeerPid() below.
735 if (override_peer_pid_ != 0)
736 listener_->OnChannelConnected(override_peer_pid_);
737 } else {
738 listener_->OnChannelConnected(pid);
739 }
740 } else { 731 } else {
741 listener_->OnMessageReceived(m); 732 listener_->OnMessageReceived(m);
742 } 733 }
743 p = message_tail; 734 p = message_tail;
744 } else { 735 } else {
745 // Last message is partial. 736 // Last message is partial.
746 break; 737 break;
747 } 738 }
748 input_overflow_fds_ = std::vector<int>(&fds[fds_i], &fds[num_fds]); 739 input_overflow_fds_ = std::vector<int>(&fds[fds_i], &fds[num_fds]);
749 fds_i = 0; 740 fds_i = 0;
(...skipping 245 matching lines...) Expand 10 before | Expand all | Expand 10 after
995 986
996 // Close any outstanding, received file descriptors. 987 // Close any outstanding, received file descriptors.
997 for (std::vector<int>::iterator 988 for (std::vector<int>::iterator
998 i = input_overflow_fds_.begin(); i != input_overflow_fds_.end(); ++i) { 989 i = input_overflow_fds_.begin(); i != input_overflow_fds_.end(); ++i) {
999 if (HANDLE_EINTR(close(*i)) < 0) 990 if (HANDLE_EINTR(close(*i)) < 0)
1000 PLOG(ERROR) << "close"; 991 PLOG(ERROR) << "close";
1001 } 992 }
1002 input_overflow_fds_.clear(); 993 input_overflow_fds_.clear();
1003 } 994 }
1004 995
1005 #if defined(OS_LINUX)
1006 void Channel::ChannelImpl::SetNeedsOverridePeerPid() {
1007 needs_override_peer_pid_ = true;
1008 }
1009
1010 void Channel::ChannelImpl::OverridePeerPid(int32 peer_pid) {
1011 DCHECK(needs_override_peer_pid_);
1012 override_peer_pid_ = peer_pid;
1013
1014 // The browser learns the global PID of the renderers on the UI thread, and
1015 // must post the data to the IO thread for us to use it here. Therefore
1016 // there is a race between the IPC channel processing the hello message
1017 // and this function being called. If fd_pipe_ != -1 then we've already
1018 // received the hello message and we skipped OnChannelConnected() above,
1019 // so call it here.
1020 if (fd_pipe_ != -1) {
1021 listener_->OnChannelConnected(peer_pid);
1022 }
1023 }
1024 #endif // defined(OS_LINUX)
1025
1026 // static 996 // static
1027 bool Channel::ChannelImpl::IsNamedServerInitialized( 997 bool Channel::ChannelImpl::IsNamedServerInitialized(
1028 const std::string& channel_id) { 998 const std::string& channel_id) {
1029 return file_util::PathExists(FilePath(channel_id)); 999 return file_util::PathExists(FilePath(channel_id));
1030 } 1000 }
1031 1001
1032 // Called by libevent when we can read from the pipe without blocking. 1002 // Called by libevent when we can read from the pipe without blocking.
1033 void Channel::ChannelImpl::OnFileCanReadWithoutBlocking(int fd) { 1003 void Channel::ChannelImpl::OnFileCanReadWithoutBlocking(int fd) {
1034 bool send_server_hello_msg = false; 1004 bool send_server_hello_msg = false;
1035 if (fd == server_listen_pipe_) { 1005 if (fd == server_listen_pipe_) {
(...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after
1231 } 1201 }
1232 1202
1233 bool Channel::GetClientEuid(uid_t* client_euid) const { 1203 bool Channel::GetClientEuid(uid_t* client_euid) const {
1234 return channel_impl_->GetClientEuid(client_euid); 1204 return channel_impl_->GetClientEuid(client_euid);
1235 } 1205 }
1236 1206
1237 void Channel::ResetToAcceptingConnectionState() { 1207 void Channel::ResetToAcceptingConnectionState() {
1238 channel_impl_->ResetToAcceptingConnectionState(); 1208 channel_impl_->ResetToAcceptingConnectionState();
1239 } 1209 }
1240 1210
1241 #if defined(OS_LINUX)
1242 void Channel::SetNeedsOverridePeerPid() {
1243 channel_impl_->SetNeedsOverridePeerPid();
1244 }
1245
1246 void Channel::OverridePeerPid(int32 peer_pid) {
1247 channel_impl_->OverridePeerPid(peer_pid);
1248 }
1249 #endif // defined(OS_LINUX)
1250
1251 // static 1211 // static
1252 bool Channel::IsNamedServerInitialized(const std::string& channel_id) { 1212 bool Channel::IsNamedServerInitialized(const std::string& channel_id) {
1253 return ChannelImpl::IsNamedServerInitialized(channel_id); 1213 return ChannelImpl::IsNamedServerInitialized(channel_id);
1254 } 1214 }
1255 1215
1256 } // namespace IPC 1216 } // namespace IPC
OLDNEW
« no previous file with comments | « ipc/ipc_channel_posix.h ('k') | ipc/ipc_channel_proxy.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698