Index: sandbox/linux/seccomp/securemem.cc |
=================================================================== |
--- sandbox/linux/seccomp/securemem.cc (revision 57969) |
+++ sandbox/linux/seccomp/securemem.cc (working copy) |
@@ -1,105 +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 "mutex.h" |
-#include "sandbox_impl.h" |
-#include "securemem.h" |
- |
-namespace playground { |
- |
-void SecureMem::abandonSystemCall(int fd, int err) { |
- void* rc = reinterpret_cast<void *>(err); |
- if (err) { |
- Debug::message("System call failed\n"); |
- } |
- Sandbox::SysCalls sys; |
- if (Sandbox::write(sys, fd, &rc, sizeof(rc)) != sizeof(rc)) { |
- Sandbox::die("Failed to send system call"); |
- } |
-} |
- |
-void SecureMem::dieIfParentDied(int parentMapsFd) { |
- // The syscall_mutex_ should not be contended. If it is, we are either |
- // experiencing a very unusual load of system calls that the sandbox is not |
- // optimized for; or, more likely, the sandboxed process terminated while the |
- // trusted process was in the middle of waiting for the mutex. We detect |
- // this situation and terminate the trusted process. |
- int alive = !lseek(parentMapsFd, 0, SEEK_SET); |
- if (alive) { |
- char buf; |
- do { |
- alive = read(parentMapsFd, &buf, 1); |
- } while (alive < 0 && errno == EINTR); |
- } |
- if (!alive) { |
- Sandbox::die(); |
- } |
-} |
- |
-void SecureMem::lockSystemCall(int parentMapsFd, Args* mem) { |
- while (!Mutex::lockMutex(&Sandbox::syscall_mutex_, 500)) { |
- dieIfParentDied(parentMapsFd); |
- } |
- asm volatile( |
- #if defined(__x86_64__) |
- "lock; incq (%0)\n" |
- #elif defined(__i386__) |
- "lock; incl (%0)\n" |
- #else |
- #error Unsupported target platform |
- #endif |
- : |
- : "q"(&mem->sequence) |
- : "memory"); |
-} |
- |
-void SecureMem::sendSystemCallInternal(int fd, bool locked, int parentMapsFd, |
- Args* mem, int syscallNum, void* arg1, |
- void* arg2, void* arg3, void* arg4, |
- void* arg5, void* arg6) { |
- if (!locked) { |
- asm volatile( |
- #if defined(__x86_64__) |
- "lock; incq (%0)\n" |
- #elif defined(__i386__) |
- "lock; incl (%0)\n" |
- #else |
- #error Unsupported target platform |
- #endif |
- : |
- : "q"(&mem->sequence) |
- : "memory"); |
- } |
- mem->callType = locked ? -2 : -1; |
- mem->syscallNum = syscallNum; |
- mem->arg1 = arg1; |
- mem->arg2 = arg2; |
- mem->arg3 = arg3; |
- mem->arg4 = arg4; |
- mem->arg5 = arg5; |
- mem->arg6 = arg6; |
- asm volatile( |
- #if defined(__x86_64__) |
- "lock; incq (%0)\n" |
- #elif defined(__i386__) |
- "lock; incl (%0)\n" |
- #else |
- #error Unsupported target platform |
- #endif |
- : |
- : "q"(&mem->sequence) |
- : "memory"); |
- Sandbox::SysCalls sys; |
- if (Sandbox::write(sys, fd, &mem->callType, sizeof(int)) != sizeof(int)) { |
- Sandbox::die("Failed to send system call"); |
- } |
- if (parentMapsFd >= 0) { |
- while (!Mutex::waitForUnlock(&Sandbox::syscall_mutex_, 500)) { |
- dieIfParentDied(parentMapsFd); |
- } |
- } |
-} |
- |
-} // namespace |