Index: sandbox/linux/seccomp/sigprocmask.cc |
=================================================================== |
--- sandbox/linux/seccomp/sigprocmask.cc (revision 57969) |
+++ sandbox/linux/seccomp/sigprocmask.cc (working copy) |
@@ -1,120 +0,0 @@ |
-// Copyright (c) 2010 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "debug.h" |
-#include "sandbox_impl.h" |
- |
-namespace playground { |
- |
-// If the sandboxed process tries to mask SIGSEGV, there is a good chance |
-// the process will eventually get terminated. If this is really ever a |
-// problem, we can hide the fact that SIGSEGV is unmasked. But I don't think |
-// we really need this. Masking of synchronous signals is rarely necessary. |
- |
-#if defined(__NR_sigprocmask) |
-long Sandbox::sandbox_sigprocmask(int how, const void* set, void* old_set) { |
- long long tm; |
- Debug::syscall(&tm, __NR_sigprocmask, "Executing handler"); |
- |
- // Access the signal mask by triggering a SEGV and modifying the signal state |
- // prior to calling rt_sigreturn(). |
- long res = -ENOSYS; |
- #if defined(__x86_64__) |
- #error x86-64 does not support sigprocmask(); use rt_sigprocmask() instead |
- #elif defined(__i386__) |
- asm volatile( |
- "push %%ebx\n" |
- "movl %2, %%ebx\n" |
- "int $0\n" |
- "pop %%ebx\n" |
- : "=a"(res) |
- : "0"(__NR_sigprocmask), "ri"((long)how), |
- "c"((long)set), "d"((long)old_set) |
- : "esp", "memory"); |
- #else |
- #error Unsupported target platform |
- #endif |
- |
- // Update our shadow signal mask, so that we can copy it upon creation of |
- // new threads. |
- if (res == 0 && set != NULL) { |
- SecureMem::Args* args = getSecureMem(); |
- switch (how) { |
- case SIG_BLOCK: |
- *(unsigned long long *)&args->signalMask |= *(unsigned long long *)set; |
- break; |
- case SIG_UNBLOCK: |
- *(unsigned long long *)&args->signalMask &= ~*(unsigned long long *)set; |
- break; |
- case SIG_SETMASK: |
- *(unsigned long long *)&args->signalMask = *(unsigned long long *)set; |
- break; |
- default: |
- break; |
- } |
- } |
- |
- Debug::elapsed(tm, __NR_sigprocmask); |
- |
- return res; |
-} |
-#endif |
- |
-#if defined(__NR_rt_sigprocmask) |
-long Sandbox::sandbox_rt_sigprocmask(int how, const void* set, void* old_set, |
- size_t bytes) { |
- long long tm; |
- Debug::syscall(&tm, __NR_rt_sigprocmask, "Executing handler"); |
- |
- // Access the signal mask by triggering a SEGV and modifying the signal state |
- // prior to calling rt_sigreturn(). |
- long res = -ENOSYS; |
- #if defined(__x86_64__) |
- asm volatile( |
- "movq %5, %%r10\n" |
- "int $0\n" |
- : "=a"(res) |
- : "0"(__NR_rt_sigprocmask), "D"((long)how), |
- "S"((long)set), "d"((long)old_set), "r"((long)bytes) |
- : "r10", "r11", "rcx", "memory"); |
- #elif defined(__i386__) |
- asm volatile( |
- "push %%ebx\n" |
- "movl %2, %%ebx\n" |
- "int $0\n" |
- "pop %%ebx\n" |
- : "=a"(res) |
- : "0"(__NR_rt_sigprocmask), "ri"((long)how), |
- "c"((long)set), "d"((long)old_set), "S"((long)bytes) |
- : "esp", "memory"); |
- #else |
- #error Unsupported target platform |
- #endif |
- |
- // Update our shadow signal mask, so that we can copy it upon creation of |
- // new threads. |
- if (res == 0 && set != NULL && bytes >= 8) { |
- SecureMem::Args* args = getSecureMem(); |
- switch (how) { |
- case SIG_BLOCK: |
- *(unsigned long long *)&args->signalMask |= *(unsigned long long *)set; |
- break; |
- case SIG_UNBLOCK: |
- *(unsigned long long *)&args->signalMask &= ~*(unsigned long long *)set; |
- break; |
- case SIG_SETMASK: |
- *(unsigned long long *)&args->signalMask = *(unsigned long long *)set; |
- break; |
- default: |
- break; |
- } |
- } |
- |
- Debug::elapsed(tm, __NR_rt_sigprocmask); |
- |
- return res; |
-} |
-#endif |
- |
-} // namespace |