| Index: sandbox/linux/seccomp-bpf/sandbox_bpf.cc
|
| diff --git a/sandbox/linux/seccomp-bpf/sandbox_bpf.cc b/sandbox/linux/seccomp-bpf/sandbox_bpf.cc
|
| index 497c343f2805929c38458853e86b41dbd24c4d92..18bd30fb910134b8f601c116fe65e2bef399db89 100644
|
| --- a/sandbox/linux/seccomp-bpf/sandbox_bpf.cc
|
| +++ b/sandbox/linux/seccomp-bpf/sandbox_bpf.cc
|
| @@ -79,9 +79,7 @@ void ProbeProcess(void) {
|
| }
|
|
|
| ErrorCode AllowAllEvaluator(SandboxBPF*, int sysnum, void*) {
|
| - if (!SandboxBPF::IsValidSyscallNumber(sysnum)) {
|
| - return ErrorCode(ENOSYS);
|
| - }
|
| + DCHECK(SandboxBPF::IsValidSyscallNumber(sysnum));
|
| return ErrorCode(ErrorCode::ERR_ALLOWED);
|
| }
|
|
|
| @@ -188,13 +186,21 @@ class RedirectToUserSpacePolicyWrapper : public SandboxBPFPolicy {
|
| ErrorCode err =
|
| wrapped_policy_->EvaluateSyscall(sandbox_compiler, system_call_number);
|
| if ((err.err() & SECCOMP_RET_ACTION) == SECCOMP_RET_ERRNO) {
|
| - return sandbox_compiler->Trap(
|
| - ReturnErrno, reinterpret_cast<void*>(err.err() & SECCOMP_RET_DATA));
|
| + return ReturnErrnoViaTrap(sandbox_compiler, err.err() & SECCOMP_RET_DATA);
|
| }
|
| return err;
|
| }
|
|
|
| + virtual ErrorCode InvalidSyscall(
|
| + SandboxBPF* sandbox_compiler) const OVERRIDE {
|
| + return ReturnErrnoViaTrap(sandbox_compiler, ENOSYS);
|
| + }
|
| +
|
| private:
|
| + ErrorCode ReturnErrnoViaTrap(SandboxBPF* sandbox_compiler, int err) const {
|
| + return sandbox_compiler->Trap(ReturnErrno, reinterpret_cast<void*>(err));
|
| + }
|
| +
|
| const SandboxBPFPolicy* wrapped_policy_;
|
| DISALLOW_COPY_AND_ASSIGN(RedirectToUserSpacePolicyWrapper);
|
| };
|
| @@ -463,13 +469,8 @@ bool SandboxBPF::StartSandbox(SandboxThreadState thread_state) {
|
| }
|
|
|
| void SandboxBPF::PolicySanityChecks(SandboxBPFPolicy* policy) {
|
| - for (SyscallIterator iter(true); !iter.Done();) {
|
| - uint32_t sysnum = iter.Next();
|
| - if (!IsDenied(policy->EvaluateSyscall(this, sysnum))) {
|
| - SANDBOX_DIE(
|
| - "Policies should deny system calls that are outside the "
|
| - "expected range (typically MIN_SYSCALL..MAX_SYSCALL)");
|
| - }
|
| + if (!IsDenied(policy->InvalidSyscall(this))) {
|
| + SANDBOX_DIE("Policies should deny invalid system calls.");
|
| }
|
| return;
|
| }
|
| @@ -745,20 +746,18 @@ void SandboxBPF::FindRanges(Ranges* ranges) {
|
| // deal with this disparity by enumerating from MIN_SYSCALL to MAX_SYSCALL,
|
| // and then verifying that the rest of the number range (both positive and
|
| // negative) all return the same ErrorCode.
|
| + const ErrorCode invalid_err = policy_->InvalidSyscall(this);
|
| uint32_t old_sysnum = 0;
|
| - ErrorCode old_err = policy_->EvaluateSyscall(this, old_sysnum);
|
| - ErrorCode invalid_err = policy_->EvaluateSyscall(this, MIN_SYSCALL - 1);
|
| + ErrorCode old_err = IsValidSyscallNumber(old_sysnum)
|
| + ? policy_->EvaluateSyscall(this, old_sysnum)
|
| + : invalid_err;
|
|
|
| for (SyscallIterator iter(false); !iter.Done();) {
|
| uint32_t sysnum = iter.Next();
|
| - ErrorCode err = policy_->EvaluateSyscall(this, static_cast<int>(sysnum));
|
| - if (!iter.IsValid(sysnum) && !invalid_err.Equals(err)) {
|
| - // A proper sandbox policy should always treat system calls outside of
|
| - // the range MIN_SYSCALL..MAX_SYSCALL (i.e. anything that returns
|
| - // "false" for SyscallIterator::IsValid()) identically. Typically, all
|
| - // of these system calls would be denied with the same ErrorCode.
|
| - SANDBOX_DIE("Invalid seccomp policy");
|
| - }
|
| + ErrorCode err =
|
| + IsValidSyscallNumber(sysnum)
|
| + ? policy_->EvaluateSyscall(this, static_cast<int>(sysnum))
|
| + : invalid_err;
|
| if (!err.Equals(old_err) || iter.Done()) {
|
| ranges->push_back(Range(old_sysnum, sysnum - 1, old_err));
|
| old_sysnum = sysnum;
|
|
|