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

Side by Side Diff: ipc/ipc_channel_posix.cc

Issue 1120343002: Make IPC::Channel buffers stack based and secure against growth (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Moved static_assert Created 5 years, 6 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
« no previous file with comments | « ipc/ipc_channel_posix.h ('k') | no next file » | 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) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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/socket.h> 10 #include <sys/socket.h>
(...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after
185 Mode mode, Listener* listener) 185 Mode mode, Listener* listener)
186 : ChannelReader(listener), 186 : ChannelReader(listener),
187 mode_(mode), 187 mode_(mode),
188 peer_pid_(base::kNullProcessId), 188 peer_pid_(base::kNullProcessId),
189 is_blocked_on_write_(false), 189 is_blocked_on_write_(false),
190 waiting_connect_(true), 190 waiting_connect_(true),
191 message_send_bytes_written_(0), 191 message_send_bytes_written_(0),
192 pipe_name_(channel_handle.name), 192 pipe_name_(channel_handle.name),
193 in_dtor_(false), 193 in_dtor_(false),
194 must_unlink_(false) { 194 must_unlink_(false) {
195 memset(input_cmsg_buf_, 0, sizeof(input_cmsg_buf_));
196 if (!CreatePipe(channel_handle)) { 195 if (!CreatePipe(channel_handle)) {
197 // The pipe may have been closed already. 196 // The pipe may have been closed already.
198 const char *modestr = (mode_ & MODE_SERVER_FLAG) ? "server" : "client"; 197 const char *modestr = (mode_ & MODE_SERVER_FLAG) ? "server" : "client";
199 LOG(WARNING) << "Unable to create pipe named \"" << channel_handle.name 198 LOG(WARNING) << "Unable to create pipe named \"" << channel_handle.name
200 << "\" in " << modestr << " mode"; 199 << "\" in " << modestr << " mode";
201 } 200 }
202 } 201 }
203 202
204 ChannelPosix::~ChannelPosix() { 203 ChannelPosix::~ChannelPosix() {
205 in_dtor_ = true; 204 in_dtor_ = true;
(...skipping 541 matching lines...) Expand 10 before | Expand all | Expand 10 after
747 int* bytes_read) { 746 int* bytes_read) {
748 if (!pipe_.is_valid()) 747 if (!pipe_.is_valid())
749 return READ_FAILED; 748 return READ_FAILED;
750 749
751 struct msghdr msg = {0}; 750 struct msghdr msg = {0};
752 751
753 struct iovec iov = {buffer, static_cast<size_t>(buffer_len)}; 752 struct iovec iov = {buffer, static_cast<size_t>(buffer_len)};
754 msg.msg_iov = &iov; 753 msg.msg_iov = &iov;
755 msg.msg_iovlen = 1; 754 msg.msg_iovlen = 1;
756 755
757 msg.msg_control = input_cmsg_buf_; 756 char input_cmsg_buf[kMaxReadFDBuffer];
757 msg.msg_control = input_cmsg_buf;
758 758
759 // recvmsg() returns 0 if the connection has closed or EAGAIN if no data 759 // recvmsg() returns 0 if the connection has closed or EAGAIN if no data
760 // is waiting on the pipe. 760 // is waiting on the pipe.
761 msg.msg_controllen = sizeof(input_cmsg_buf_); 761 msg.msg_controllen = sizeof(input_cmsg_buf);
762 *bytes_read = HANDLE_EINTR(recvmsg(pipe_.get(), &msg, MSG_DONTWAIT)); 762 *bytes_read = HANDLE_EINTR(recvmsg(pipe_.get(), &msg, MSG_DONTWAIT));
763 763
764 if (*bytes_read < 0) { 764 if (*bytes_read < 0) {
765 if (errno == EAGAIN) { 765 if (errno == EAGAIN) {
766 return READ_PENDING; 766 return READ_PENDING;
767 #if defined(OS_MACOSX) 767 #if defined(OS_MACOSX)
768 } else if (errno == EPERM) { 768 } else if (errno == EPERM) {
769 // On OSX, reading from a pipe with no listener returns EPERM 769 // On OSX, reading from a pipe with no listener returns EPERM
770 // treat this as a special case to prevent spurious error messages 770 // treat this as a special case to prevent spurious error messages
771 // to the console. 771 // to the console.
(...skipping 246 matching lines...) Expand 10 before | Expand all | Expand 10 after
1018 } 1018 }
1019 1019
1020 #if defined(OS_LINUX) 1020 #if defined(OS_LINUX)
1021 // static 1021 // static
1022 void Channel::SetGlobalPid(int pid) { 1022 void Channel::SetGlobalPid(int pid) {
1023 ChannelPosix::SetGlobalPid(pid); 1023 ChannelPosix::SetGlobalPid(pid);
1024 } 1024 }
1025 #endif // OS_LINUX 1025 #endif // OS_LINUX
1026 1026
1027 } // namespace IPC 1027 } // namespace IPC
OLDNEW
« no previous file with comments | « ipc/ipc_channel_posix.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698