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

Side by Side Diff: base/posix/unix_domain_socket.cc

Issue 11108019: linux: Crash browser on too-big messages to zygote. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: update CHECKs Created 8 years, 2 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 | « base/posix/unix_domain_socket.h ('k') | content/browser/zygote_host/zygote_host_impl_linux.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 "base/posix/unix_domain_socket.h" 5 #include "base/posix/unix_domain_socket.h"
6 6
7 #include <errno.h> 7 #include <errno.h>
8 #include <unistd.h> 8 #include <unistd.h>
9 #include <sys/uio.h> 9 #include <sys/uio.h>
10 #include <sys/socket.h> 10 #include <sys/socket.h>
11 11
12 #include "base/eintr_wrapper.h" 12 #include "base/eintr_wrapper.h"
13 #include "base/logging.h" 13 #include "base/logging.h"
14 #include "base/pickle.h" 14 #include "base/pickle.h"
15 #include "base/stl_util.h" 15 #include "base/stl_util.h"
16 16
17 const size_t UnixDomainSocket::kMaxFileDescriptors = 16;
18
17 // static 19 // static
18 bool UnixDomainSocket::SendMsg(int fd, 20 bool UnixDomainSocket::SendMsg(int fd,
19 const void* buf, 21 const void* buf,
20 size_t length, 22 size_t length,
21 const std::vector<int>& fds) { 23 const std::vector<int>& fds) {
22 struct msghdr msg; 24 struct msghdr msg;
23 memset(&msg, 0, sizeof(msg)); 25 memset(&msg, 0, sizeof(msg));
24 struct iovec iov = {const_cast<void*>(buf), length}; 26 struct iovec iov = {const_cast<void*>(buf), length};
25 msg.msg_iov = &iov; 27 msg.msg_iov = &iov;
26 msg.msg_iovlen = 1; 28 msg.msg_iovlen = 1;
(...skipping 18 matching lines...) Expand all
45 const bool ret = static_cast<ssize_t>(length) == r; 47 const bool ret = static_cast<ssize_t>(length) == r;
46 delete[] control_buffer; 48 delete[] control_buffer;
47 return ret; 49 return ret;
48 } 50 }
49 51
50 // static 52 // static
51 ssize_t UnixDomainSocket::RecvMsg(int fd, 53 ssize_t UnixDomainSocket::RecvMsg(int fd,
52 void* buf, 54 void* buf,
53 size_t length, 55 size_t length,
54 std::vector<int>* fds) { 56 std::vector<int>* fds) {
55 static const unsigned kMaxDescriptors = 16;
56
57 fds->clear(); 57 fds->clear();
58 58
59 struct msghdr msg; 59 struct msghdr msg;
60 memset(&msg, 0, sizeof(msg)); 60 memset(&msg, 0, sizeof(msg));
61 struct iovec iov = {buf, length}; 61 struct iovec iov = {buf, length};
62 msg.msg_iov = &iov; 62 msg.msg_iov = &iov;
63 msg.msg_iovlen = 1; 63 msg.msg_iovlen = 1;
64 64
65 char control_buffer[CMSG_SPACE(sizeof(int) * kMaxDescriptors)]; 65 char control_buffer[CMSG_SPACE(sizeof(int) * kMaxFileDescriptors)];
66 msg.msg_control = control_buffer; 66 msg.msg_control = control_buffer;
67 msg.msg_controllen = sizeof(control_buffer); 67 msg.msg_controllen = sizeof(control_buffer);
68 68
69 const ssize_t r = HANDLE_EINTR(recvmsg(fd, &msg, 0)); 69 const ssize_t r = HANDLE_EINTR(recvmsg(fd, &msg, 0));
70 if (r == -1) 70 if (r == -1)
71 return -1; 71 return -1;
72 72
73 int* wire_fds = NULL; 73 int* wire_fds = NULL;
74 unsigned wire_fds_len = 0; 74 unsigned wire_fds_len = 0;
75 75
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
137 NOTREACHED(); 137 NOTREACHED();
138 138
139 return -1; 139 return -1;
140 } 140 }
141 141
142 if (result_fd) 142 if (result_fd)
143 *result_fd = fd_vector.empty() ? -1 : fd_vector[0]; 143 *result_fd = fd_vector.empty() ? -1 : fd_vector[0];
144 144
145 return reply_len; 145 return reply_len;
146 } 146 }
OLDNEW
« no previous file with comments | « base/posix/unix_domain_socket.h ('k') | content/browser/zygote_host/zygote_host_impl_linux.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698