| OLD | NEW |
| 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 #ifndef SECCOMP_BPF_STANDALONE |
| 6 #include "base/logging.h" |
| 7 #include "base/posix/eintr_wrapper.h" |
| 8 #endif |
| 9 |
| 5 #include "sandbox/linux/seccomp-bpf/codegen.h" | 10 #include "sandbox/linux/seccomp-bpf/codegen.h" |
| 6 #include "sandbox/linux/seccomp-bpf/sandbox_bpf.h" | 11 #include "sandbox/linux/seccomp-bpf/sandbox_bpf.h" |
| 7 #include "sandbox/linux/seccomp-bpf/syscall_iterator.h" | 12 #include "sandbox/linux/seccomp-bpf/syscall_iterator.h" |
| 8 #include "sandbox/linux/seccomp-bpf/verifier.h" | 13 #include "sandbox/linux/seccomp-bpf/verifier.h" |
| 9 | 14 |
| 10 namespace { | 15 namespace { |
| 11 | 16 |
| 12 void WriteFailedStderrSetupMessage(int out_fd) { | 17 void WriteFailedStderrSetupMessage(int out_fd) { |
| 13 const char* error_string = strerror(errno); | 18 const char* error_string = strerror(errno); |
| 14 static const char msg[] = "Failed to set up stderr: "; | 19 static const char msg[] = "You have reproduced a puzzling issue.\n" |
| 20 "Please, report to crbug.com/152530!\n" |
| 21 "Failed to set up stderr: "; |
| 15 if (HANDLE_EINTR(write(out_fd, msg, sizeof(msg)-1)) > 0 && error_string && | 22 if (HANDLE_EINTR(write(out_fd, msg, sizeof(msg)-1)) > 0 && error_string && |
| 16 HANDLE_EINTR(write(out_fd, error_string, strlen(error_string))) > 0 && | 23 HANDLE_EINTR(write(out_fd, error_string, strlen(error_string))) > 0 && |
| 17 HANDLE_EINTR(write(out_fd, "\n", 1))) { | 24 HANDLE_EINTR(write(out_fd, "\n", 1))) { |
| 18 } | 25 } |
| 19 } | 26 } |
| 20 | 27 |
| 21 } // namespace | 28 } // namespace |
| 22 | 29 |
| 23 // The kernel gives us a sandbox, we turn it into a playground :-) | 30 // The kernel gives us a sandbox, we turn it into a playground :-) |
| 24 // This is version 2 of the playground; version 1 was built on top of | 31 // This is version 2 of the playground; version 1 was built on top of |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 100 sigprocmask(SIG_SETMASK, &oldMask, NULL); // OK, if it fails | 107 sigprocmask(SIG_SETMASK, &oldMask, NULL); // OK, if it fails |
| 101 SANDBOX_DIE("fork() failed unexpectedly"); | 108 SANDBOX_DIE("fork() failed unexpectedly"); |
| 102 } | 109 } |
| 103 | 110 |
| 104 // In the child process | 111 // In the child process |
| 105 if (!pid) { | 112 if (!pid) { |
| 106 // Test a very simple sandbox policy to verify that we can | 113 // Test a very simple sandbox policy to verify that we can |
| 107 // successfully turn on sandboxing. | 114 // successfully turn on sandboxing. |
| 108 Die::EnableSimpleExit(); | 115 Die::EnableSimpleExit(); |
| 109 | 116 |
| 117 errno = 0; |
| 110 if (HANDLE_EINTR(close(fds[0]))) { | 118 if (HANDLE_EINTR(close(fds[0]))) { |
| 119 // This call to close() has been failing in strange ways. See |
| 120 // crbug.com/152530. So we only fail in debug mode now. |
| 121 #if !defined(NDEBUG) |
| 111 WriteFailedStderrSetupMessage(fds[1]); | 122 WriteFailedStderrSetupMessage(fds[1]); |
| 112 SANDBOX_DIE(NULL); | 123 SANDBOX_DIE(NULL); |
| 124 #endif |
| 113 } | 125 } |
| 114 if (HANDLE_EINTR(dup2(fds[1], 2)) != 2) { | 126 if (HANDLE_EINTR(dup2(fds[1], 2)) != 2) { |
| 115 // Stderr could very well be a file descriptor to .xsession-errors, or | 127 // Stderr could very well be a file descriptor to .xsession-errors, or |
| 116 // another file, which could be backed by a file system that could cause | 128 // another file, which could be backed by a file system that could cause |
| 117 // dup2 to fail while trying to close stderr. It's important that we do | 129 // dup2 to fail while trying to close stderr. It's important that we do |
| 118 // not fail on trying to close stderr. | 130 // not fail on trying to close stderr. |
| 119 // If dup2 fails here, we will continue normally, this means that our | 131 // If dup2 fails here, we will continue normally, this means that our |
| 120 // parent won't cause a fatal failure if something writes to stderr in | 132 // parent won't cause a fatal failure if something writes to stderr in |
| 121 // this child. | 133 // this child. |
| 134 #if !defined(NDEBUG) |
| 135 // In DEBUG builds, we still want to get a report. |
| 136 WriteFailedStderrSetupMessage(fds[1]); |
| 137 SANDBOX_DIE(NULL); |
| 138 #endif |
| 122 } | 139 } |
| 123 if (HANDLE_EINTR(close(fds[1]))) { | 140 if (HANDLE_EINTR(close(fds[1]))) { |
| 141 // This call to close() has been failing in strange ways. See |
| 142 // crbug.com/152530. So we only fail in debug mode now. |
| 143 #if !defined(NDEBUG) |
| 124 WriteFailedStderrSetupMessage(fds[1]); | 144 WriteFailedStderrSetupMessage(fds[1]); |
| 125 SANDBOX_DIE(NULL); | 145 SANDBOX_DIE(NULL); |
| 146 #endif |
| 126 } | 147 } |
| 127 | 148 |
| 128 evaluators_.clear(); | 149 evaluators_.clear(); |
| 129 setSandboxPolicy(syscallEvaluator, NULL); | 150 setSandboxPolicy(syscallEvaluator, NULL); |
| 130 setProcFd(proc_fd); | 151 setProcFd(proc_fd); |
| 131 | 152 |
| 132 // By passing "quiet=true" to "startSandboxInternal()" we suppress | 153 // By passing "quiet=true" to "startSandboxInternal()" we suppress |
| 133 // messages for expected and benign failures (e.g. if the current | 154 // messages for expected and benign failures (e.g. if the current |
| 134 // kernel lacks support for BPF filters). | 155 // kernel lacks support for BPF filters). |
| 135 startSandboxInternal(true); | 156 startSandboxInternal(true); |
| (...skipping 508 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 644 Sandbox::SandboxStatus Sandbox::status_ = STATUS_UNKNOWN; | 665 Sandbox::SandboxStatus Sandbox::status_ = STATUS_UNKNOWN; |
| 645 int Sandbox::proc_fd_ = -1; | 666 int Sandbox::proc_fd_ = -1; |
| 646 Sandbox::Evaluators Sandbox::evaluators_; | 667 Sandbox::Evaluators Sandbox::evaluators_; |
| 647 Sandbox::ErrMap Sandbox::errMap_; | 668 Sandbox::ErrMap Sandbox::errMap_; |
| 648 Sandbox::Traps *Sandbox::traps_ = NULL; | 669 Sandbox::Traps *Sandbox::traps_ = NULL; |
| 649 Sandbox::TrapIds Sandbox::trapIds_; | 670 Sandbox::TrapIds Sandbox::trapIds_; |
| 650 ErrorCode *Sandbox::trapArray_ = NULL; | 671 ErrorCode *Sandbox::trapArray_ = NULL; |
| 651 size_t Sandbox::trapArraySize_ = 0; | 672 size_t Sandbox::trapArraySize_ = 0; |
| 652 | 673 |
| 653 } // namespace | 674 } // namespace |
| OLD | NEW |