| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "sandbox/linux/syscall_broker/broker_host.h" | 5 #include "sandbox/linux/syscall_broker/broker_host.h" |
| 6 | 6 |
| 7 #include <fcntl.h> | 7 #include <fcntl.h> |
| 8 #include <sys/socket.h> | 8 #include <sys/socket.h> |
| 9 #include <sys/stat.h> | 9 #include <sys/stat.h> |
| 10 #include <sys/syscall.h> | 10 #include <sys/syscall.h> |
| (...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 133 case COMMAND_OPEN: | 133 case COMMAND_OPEN: |
| 134 OpenFileForIPC( | 134 OpenFileForIPC( |
| 135 policy, requested_filename, flags, &write_pickle, &opened_files); | 135 policy, requested_filename, flags, &write_pickle, &opened_files); |
| 136 break; | 136 break; |
| 137 default: | 137 default: |
| 138 LOG(ERROR) << "Invalid IPC command"; | 138 LOG(ERROR) << "Invalid IPC command"; |
| 139 break; | 139 break; |
| 140 } | 140 } |
| 141 | 141 |
| 142 CHECK_LE(write_pickle.size(), kMaxMessageLength); | 142 CHECK_LE(write_pickle.size(), kMaxMessageLength); |
| 143 ssize_t sent = UnixDomainSocket::SendMsg( | 143 ssize_t sent = base::UnixDomainSocket::SendMsg( |
| 144 reply_ipc, write_pickle.data(), write_pickle.size(), opened_files); | 144 reply_ipc, write_pickle.data(), write_pickle.size(), opened_files); |
| 145 | 145 |
| 146 // Close anything we have opened in this process. | 146 // Close anything we have opened in this process. |
| 147 for (std::vector<int>::iterator it = opened_files.begin(); | 147 for (std::vector<int>::iterator it = opened_files.begin(); |
| 148 it != opened_files.end(); | 148 it != opened_files.end(); |
| 149 ++it) { | 149 ++it) { |
| 150 int ret = IGNORE_EINTR(close(*it)); | 150 int ret = IGNORE_EINTR(close(*it)); |
| 151 DCHECK(!ret) << "Could not close file descriptor"; | 151 DCHECK(!ret) << "Could not close file descriptor"; |
| 152 } | 152 } |
| 153 | 153 |
| (...skipping 15 matching lines...) Expand all Loading... |
| 169 } | 169 } |
| 170 | 170 |
| 171 // Handle a request on the IPC channel ipc_channel_. | 171 // Handle a request on the IPC channel ipc_channel_. |
| 172 // A request should have a file descriptor attached on which we will reply and | 172 // A request should have a file descriptor attached on which we will reply and |
| 173 // that we will then close. | 173 // that we will then close. |
| 174 // A request should start with an int that will be used as the command type. | 174 // A request should start with an int that will be used as the command type. |
| 175 BrokerHost::RequestStatus BrokerHost::HandleRequest() const { | 175 BrokerHost::RequestStatus BrokerHost::HandleRequest() const { |
| 176 ScopedVector<base::ScopedFD> fds; | 176 ScopedVector<base::ScopedFD> fds; |
| 177 char buf[kMaxMessageLength]; | 177 char buf[kMaxMessageLength]; |
| 178 errno = 0; | 178 errno = 0; |
| 179 const ssize_t msg_len = | 179 const ssize_t msg_len = base::UnixDomainSocket::RecvMsg( |
| 180 UnixDomainSocket::RecvMsg(ipc_channel_.get(), buf, sizeof(buf), &fds); | 180 ipc_channel_.get(), buf, sizeof(buf), &fds); |
| 181 | 181 |
| 182 if (msg_len == 0 || (msg_len == -1 && errno == ECONNRESET)) { | 182 if (msg_len == 0 || (msg_len == -1 && errno == ECONNRESET)) { |
| 183 // EOF from the client, or the client died, we should die. | 183 // EOF from the client, or the client died, we should die. |
| 184 return RequestStatus::LOST_CLIENT; | 184 return RequestStatus::LOST_CLIENT; |
| 185 } | 185 } |
| 186 | 186 |
| 187 // The client should send exactly one file descriptor, on which we | 187 // The client should send exactly one file descriptor, on which we |
| 188 // will write the reply. | 188 // will write the reply. |
| 189 // TODO(mdempsky): ScopedVector doesn't have 'at()', only 'operator[]'. | 189 // TODO(mdempsky): ScopedVector doesn't have 'at()', only 'operator[]'. |
| 190 if (msg_len < 0 || fds.size() != 1 || fds[0]->get() < 0) { | 190 if (msg_len < 0 || fds.size() != 1 || fds[0]->get() < 0) { |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 222 NOTREACHED(); | 222 NOTREACHED(); |
| 223 } | 223 } |
| 224 | 224 |
| 225 LOG(ERROR) << "Error parsing IPC request"; | 225 LOG(ERROR) << "Error parsing IPC request"; |
| 226 return RequestStatus::FAILURE; | 226 return RequestStatus::FAILURE; |
| 227 } | 227 } |
| 228 | 228 |
| 229 } // namespace syscall_broker | 229 } // namespace syscall_broker |
| 230 | 230 |
| 231 } // namespace sandbox | 231 } // namespace sandbox |
| OLD | NEW |