Chromium Code Reviews| Index: sandbox/linux/seccomp-bpf/trap.cc |
| diff --git a/sandbox/linux/seccomp-bpf/trap.cc b/sandbox/linux/seccomp-bpf/trap.cc |
| index f8b64c991b0f591c4d82bbb196e22acba7e96ece..3d88701083af14a66ac48c948df2bf43be8ee7aa 100644 |
| --- a/sandbox/linux/seccomp-bpf/trap.cc |
| +++ b/sandbox/linux/seccomp-bpf/trap.cc |
| @@ -159,7 +159,15 @@ void Trap::SigSys(int nr, siginfo_t* info, void* void_context) { |
| // safe and can lead to bugs. We should eventually implement a different |
| // logging and reporting mechanism that is safe to be called from |
| // the sigSys() handler. |
| +#if defined (__mips__) |
|
jln (very slow on Chromium)
2014/05/02 20:42:04
style: #if defined(), no space.
nedeljko
2014/05/07 15:40:05
Done.
|
| + // When indirect syscall (syscall(__NR_foo, ...)) is made on Mips, number |
| + // in register SECCOMP_SYSCALL(ctx) is always __NR_syscall and real |
| + // number of a syscall (__NR_foo) is in SECCOMP_PARM1(ctx) |
| + if (sigsys.nr != static_cast<int>(SECCOMP_PARM1(ctx))) |
| + RAW_SANDBOX_DIE("Sanity checks are failing after receiving SIGSYS."); |
|
jln (very slow on Chromium)
2014/05/02 20:42:04
I don't think this is correct. The code is no long
nedeljko
2014/05/07 15:40:05
Done.
|
| +#else |
| RAW_SANDBOX_DIE("Sanity checks are failing after receiving SIGSYS."); |
| +#endif |
| } |
| intptr_t rc; |
| @@ -168,7 +176,7 @@ void Trap::SigSys(int nr, siginfo_t* info, void* void_context) { |
| if (sigsys.nr == __NR_clone) { |
| RAW_SANDBOX_DIE("Cannot call clone() from an UnsafeTrap() handler."); |
| } |
| - rc = SandboxSyscall(sigsys.nr, |
| + rc = SandboxSyscall(SECCOMP_SYSCALL(ctx), |
| SECCOMP_PARM1(ctx), |
| SECCOMP_PARM2(ctx), |
| SECCOMP_PARM3(ctx), |
| @@ -185,7 +193,8 @@ void Trap::SigSys(int nr, siginfo_t* info, void* void_context) { |
| // is what we are showing to TrapFnc callbacks that the system call |
| // evaluator registered with the sandbox. |
| struct arch_seccomp_data data = { |
| - sigsys.nr, SECCOMP_ARCH, reinterpret_cast<uint64_t>(sigsys.ip), |
| + static_cast<int>SECCOMP_SYSCALL(ctx), SECCOMP_ARCH, |
| + reinterpret_cast<uint64_t>(sigsys.ip), |
| {static_cast<uint64_t>(SECCOMP_PARM1(ctx)), |
| static_cast<uint64_t>(SECCOMP_PARM2(ctx)), |
| static_cast<uint64_t>(SECCOMP_PARM3(ctx)), |
| @@ -198,6 +207,18 @@ void Trap::SigSys(int nr, siginfo_t* info, void* void_context) { |
| rc = err.fnc_(data, err.aux_); |
| } |
| +#if defined(__mips__) |
| + // Mips ABI states that on error a3 CPU register should be set to one |
| + // and if there is no error, it should be zero. |
| + // The other difference from Intel and Arm is in that on error kernel |
| + // returns positive value of errno. |
| + if(rc < 0) { |
| + rc = -rc; |
|
jln (very slow on Chromium)
2014/05/02 20:42:04
Let's use a wrapper for this (see comment in other
nedeljko
2014/05/07 15:40:05
Done.
|
| + SECCOMP_PARM4(ctx) = 1; |
| + } else { |
| + SECCOMP_PARM4(ctx) = 0; |
| + } |
| +#endif |
| // Update the CPU register that stores the return code of the system call |
| // that we just handled, and restore "errno" to the value that it had |
| // before entering the signal handler. |