| 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 20 matching lines...) Expand all Loading... |
| 31 namespace { | 31 namespace { |
| 32 | 32 |
| 33 bool IsRunningOnValgrind() { | 33 bool IsRunningOnValgrind() { |
| 34 return RUNNING_ON_VALGRIND; | 34 return RUNNING_ON_VALGRIND; |
| 35 } | 35 } |
| 36 | 36 |
| 37 // A little open(2) wrapper to handle some oddities for us. In the general case | 37 // A little open(2) wrapper to handle some oddities for us. In the general case |
| 38 // make a direct system call since we want to keep in control of the broker | 38 // make a direct system call since we want to keep in control of the broker |
| 39 // process' system calls profile to be able to loosely sandbox it. | 39 // process' system calls profile to be able to loosely sandbox it. |
| 40 int sys_open(const char* pathname, int flags) { | 40 int sys_open(const char* pathname, int flags) { |
| 41 // Always pass a defined |mode| in case flags mistakenly contains O_CREAT. | 41 // Hardcode mode to rw------- when creating files. |
| 42 const int mode = 0; | 42 int mode; |
| 43 if (flags & O_CREAT) { |
| 44 mode = 0600; |
| 45 } else { |
| 46 mode = 0; |
| 47 } |
| 43 if (IsRunningOnValgrind()) { | 48 if (IsRunningOnValgrind()) { |
| 44 // Valgrind does not support AT_FDCWD, just use libc's open() in this case. | 49 // Valgrind does not support AT_FDCWD, just use libc's open() in this case. |
| 45 return open(pathname, flags, mode); | 50 return open(pathname, flags, mode); |
| 46 } else { | 51 } else { |
| 47 return syscall(__NR_openat, AT_FDCWD, pathname, flags, mode); | 52 return syscall(__NR_openat, AT_FDCWD, pathname, flags, mode); |
| 48 } | 53 } |
| 49 } | 54 } |
| 50 | 55 |
| 51 // Open |requested_filename| with |flags| if allowed by our policy. | 56 // Open |requested_filename| with |flags| if allowed by our policy. |
| 52 // Write the syscall return value (-errno) to |write_pickle| and append | 57 // Write the syscall return value (-errno) to |write_pickle| and append |
| 53 // a file descriptor to |opened_files| if relevant. | 58 // a file descriptor to |opened_files| if relevant. |
| 54 void OpenFileForIPC(const BrokerPolicy& policy, | 59 void OpenFileForIPC(const BrokerPolicy& policy, |
| 55 const std::string& requested_filename, | 60 const std::string& requested_filename, |
| 56 int flags, | 61 int flags, |
| 57 Pickle* write_pickle, | 62 Pickle* write_pickle, |
| 58 std::vector<int>* opened_files) { | 63 std::vector<int>* opened_files) { |
| 59 DCHECK(write_pickle); | 64 DCHECK(write_pickle); |
| 60 DCHECK(opened_files); | 65 DCHECK(opened_files); |
| 61 const char* file_to_open = NULL; | 66 const char* file_to_open = NULL; |
| 67 bool unlink_after_open = false; |
| 62 const bool safe_to_open_file = policy.GetFileNameIfAllowedToOpen( | 68 const bool safe_to_open_file = policy.GetFileNameIfAllowedToOpen( |
| 63 requested_filename.c_str(), flags, &file_to_open); | 69 requested_filename.c_str(), flags, &file_to_open, &unlink_after_open); |
| 64 | 70 |
| 65 if (safe_to_open_file) { | 71 if (safe_to_open_file) { |
| 66 CHECK(file_to_open); | 72 CHECK(file_to_open); |
| 67 int opened_fd = sys_open(file_to_open, flags); | 73 int opened_fd = sys_open(file_to_open, flags); |
| 68 if (opened_fd < 0) { | 74 if (opened_fd < 0) { |
| 69 write_pickle->WriteInt(-errno); | 75 write_pickle->WriteInt(-errno); |
| 70 } else { | 76 } else { |
| 71 // Success. | 77 // Success. |
| 78 if (unlink_after_open) { |
| 79 unlink(file_to_open); |
| 80 } |
| 72 opened_files->push_back(opened_fd); | 81 opened_files->push_back(opened_fd); |
| 73 write_pickle->WriteInt(0); | 82 write_pickle->WriteInt(0); |
| 74 } | 83 } |
| 75 } else { | 84 } else { |
| 76 write_pickle->WriteInt(-policy.denied_errno()); | 85 write_pickle->WriteInt(-policy.denied_errno()); |
| 77 } | 86 } |
| 78 } | 87 } |
| 79 | 88 |
| 80 // Perform access(2) on |requested_filename| with mode |mode| if allowed by our | 89 // Perform access(2) on |requested_filename| with mode |mode| if allowed by our |
| 81 // policy. Write the syscall return value (-errno) to |write_pickle|. | 90 // policy. Write the syscall return value (-errno) to |write_pickle|. |
| (...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 216 NOTREACHED(); | 225 NOTREACHED(); |
| 217 } | 226 } |
| 218 | 227 |
| 219 LOG(ERROR) << "Error parsing IPC request"; | 228 LOG(ERROR) << "Error parsing IPC request"; |
| 220 return RequestStatus::FAILURE; | 229 return RequestStatus::FAILURE; |
| 221 } | 230 } |
| 222 | 231 |
| 223 } // namespace syscall_broker | 232 } // namespace syscall_broker |
| 224 | 233 |
| 225 } // namespace sandbox | 234 } // namespace sandbox |
| OLD | NEW |