Index: sandbox/linux/seccomp/sandbox_impl.h |
=================================================================== |
--- sandbox/linux/seccomp/sandbox_impl.h (revision 57969) |
+++ sandbox/linux/seccomp/sandbox_impl.h (working copy) |
@@ -1,715 +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. |
- |
-#ifndef SANDBOX_IMPL_H__ |
-#define SANDBOX_IMPL_H__ |
- |
-#include <asm/ldt.h> |
-#include <errno.h> |
-#include <fcntl.h> |
-#include <limits.h> |
-#include <linux/prctl.h> |
-#include <linux/unistd.h> |
-#include <netinet/in.h> |
-#include <netinet/tcp.h> |
-#include <sched.h> |
-#include <signal.h> |
-#include <stdarg.h> |
-#include <stdio.h> |
-#include <stdlib.h> |
-#include <string.h> |
-#include <sys/ioctl.h> |
-#include <sys/mman.h> |
-#include <sys/ptrace.h> |
-#include <sys/resource.h> |
-#include <sys/socket.h> |
-#include <sys/stat.h> |
-#include <sys/time.h> |
-#include <sys/types.h> |
-#include <time.h> |
-#include <unistd.h> |
- |
-#define NOINTR_SYS(x) \ |
- ({ typeof(x) i__; while ((i__ = (x)) < 0 && sys.my_errno == EINTR); i__;}) |
- |
-#ifdef __cplusplus |
-#include <map> |
-#include <vector> |
-#include "sandbox.h" |
-#include "securemem.h" |
-#include "tls.h" |
- |
-namespace playground { |
- |
-class Sandbox { |
- // TODO(markus): restrict access to our private file handles |
- public: |
- enum { kMaxThreads = 100 }; |
- |
- |
- // There are a lot of reasons why the Seccomp sandbox might not be available. |
- // This could be because the kernel does not support Seccomp mode, or it |
- // could be because we fail to successfully rewrite all system call entry |
- // points. |
- // "proc_fd" should be a file descriptor for "/proc", or -1 if not provided |
- // by the caller. |
- static int supportsSeccompSandbox(int proc_fd) |
- asm("SupportsSeccompSandbox"); |
- |
- // The sandbox needs to be able to access "/proc/self/maps". If this file |
- // is not accessible when "startSandbox()" gets called, the caller can |
- // provide an already opened file descriptor by calling "setProcSelfMaps()". |
- // The sandbox becomes the newer owner of this file descriptor and will |
- // eventually close it when "startSandbox()" executes. |
- static void setProcSelfMaps(int proc_self_maps) |
- asm("SeccompSandboxSetProcSelfMaps"); |
- |
- // This is the main public entry point. It finds all system calls that |
- // need rewriting, sets up the resources needed by the sandbox, and |
- // enters Seccomp mode. |
- static void startSandbox() asm("StartSeccompSandbox"); |
- |
- private: |
-// syscall_table.c has to be implemented in C, as C++ does not support |
-// designated initializers for arrays. The only other alternative would be |
-// to have a source code generator for this table. |
-// |
-// We would still like the C source file to include our header file. This |
-// requires some define statements to transform C++ specific constructs to |
-// something that is palatable to a C compiler. |
-#define STATIC static |
-#define SecureMemArgs SecureMem::Args |
- // Clone() is special as it has a wrapper in syscall_table.c. The wrapper |
- // adds one extra argument (the pointer to the saved registers) and then |
- // calls playground$sandbox__clone(). |
- static long sandbox_clone(int flags, char* stack, int* pid, int* ctid, |
- void* tls, void* wrapper_sp) |
- asm("playground$sandbox__clone") |
- #if defined(__x86_64__) |
- __attribute__((visibility("internal"))) |
-#endif |
- ; |
-#else |
-#define STATIC |
-#define bool int |
-#define SecureMemArgs void |
- // This is the wrapper entry point that is found in the syscall_table. |
- long sandbox_clone(int flags, char* stack, int* pid, int* ctid, void* tls) |
- asm("playground$sandbox_clone"); |
-#endif |
- |
- // Entry points for sandboxed code that is attempting to make system calls |
- STATIC long sandbox_access(const char*, int) |
- asm("playground$sandbox_access"); |
- STATIC long sandbox_exit(int status) asm("playground$sandbox_exit"); |
- STATIC long sandbox_getpid() asm("playground$sandbox_getpid"); |
- #if defined(__NR_getsockopt) |
- STATIC long sandbox_getsockopt(int, int, int, void*, socklen_t*) |
- asm("playground$sandbox_getsockopt"); |
- #endif |
- STATIC long sandbox_gettid() asm("playground$sandbox_gettid"); |
- STATIC long sandbox_ioctl(int d, int req, void* arg) |
- asm("playground$sandbox_ioctl"); |
- #if defined(__NR_ipc) |
- STATIC long sandbox_ipc(unsigned, int, int, int, void*, long) |
- asm("playground$sandbox_ipc"); |
- #endif |
- STATIC long sandbox_lstat(const char* path, void* buf) |
- asm("playground$sandbox_lstat"); |
- #if defined(__NR_lstat64) |
- STATIC long sandbox_lstat64(const char *path, void* b) |
- asm("playground$sandbox_lstat64"); |
- #endif |
- STATIC long sandbox_madvise(void*, size_t, int) |
- asm("playground$sandbox_madvise"); |
- STATIC void *sandbox_mmap(void* start, size_t length, int prot, int flags, |
- int fd, off_t offset) |
- asm("playground$sandbox_mmap"); |
- STATIC long sandbox_mprotect(const void*, size_t, int) |
- asm("playground$sandbox_mprotect"); |
- STATIC long sandbox_munmap(void* start, size_t length) |
- asm("playground$sandbox_munmap"); |
- STATIC long sandbox_open(const char*, int, mode_t) |
- asm("playground$sandbox_open"); |
- #if defined(__NR_recvfrom) |
- STATIC ssize_t sandbox_recvfrom(int, void*, size_t, int, void*, socklen_t*) |
- asm("playground$sandbox_recvfrom"); |
- STATIC ssize_t sandbox_recvmsg(int, struct msghdr*, int) |
- asm("playground$sandbox_recvmsg"); |
- #endif |
- #if defined(__NR_rt_sigaction) |
- STATIC long sandbox_rt_sigaction(int, const void*, void*, size_t) |
- asm("playground$sandbox_rt_sigaction"); |
- #endif |
- #if defined(__NR_rt_sigprocmask) |
- STATIC long sandbox_rt_sigprocmask(int how, const void*, void*, size_t) |
- asm("playground$sandbox_rt_sigprocmask"); |
- #endif |
- #if defined(__NR_sendmsg) |
- STATIC size_t sandbox_sendmsg(int, const struct msghdr*, int) |
- asm("playground$sandbox_sendmsg"); |
- STATIC ssize_t sandbox_sendto(int, const void*, size_t, int, const void*, |
- socklen_t)asm("playground$sandbox_sendto"); |
- #endif |
- #if defined(__NR_shmat) |
- STATIC void* sandbox_shmat(int, const void*, int) |
- asm("playground$sandbox_shmat"); |
- STATIC long sandbox_shmctl(int, int, void*) |
- asm("playground$sandbox_shmctl"); |
- STATIC long sandbox_shmdt(const void*) asm("playground$sandbox_shmdt"); |
- STATIC long sandbox_shmget(int, size_t, int) |
- asm("playground$sandbox_shmget"); |
- #endif |
- #if defined(__NR_setsockopt) |
- STATIC long sandbox_setsockopt(int, int, int, const void*, socklen_t) |
- asm("playground$sandbox_setsockopt"); |
- #endif |
- #if defined(__NR_sigaction) |
- STATIC long sandbox_sigaction(int, const void*, void*) |
- asm("playground$sandbox_sigaction"); |
- #endif |
- #if defined(__NR_signal) |
- STATIC void* sandbox_signal(int, const void*) |
- asm("playground$sandbox_signal"); |
- #endif |
- #if defined(__NR_sigprocmask) |
- STATIC long sandbox_sigprocmask(int how, const void*, void*) |
- asm("playground$sandbox_sigprocmask"); |
- #endif |
- #if defined(__NR_socketcall) |
- STATIC long sandbox_socketcall(int call, void* args) |
- asm("playground$sandbox_socketcall"); |
- #endif |
- STATIC long sandbox_stat(const char* path, void* buf) |
- asm("playground$sandbox_stat"); |
- #if defined(__NR_stat64) |
- STATIC long sandbox_stat64(const char *path, void* b) |
- asm("playground$sandbox_stat64"); |
- #endif |
- |
- // Functions for system calls that need to be handled in the trusted process |
- STATIC bool process_access(int, int, int, int, SecureMemArgs*) |
- asm("playground$process_access"); |
- STATIC bool process_clone(int, int, int, int, SecureMemArgs*) |
- asm("playground$process_clone"); |
- STATIC bool process_exit(int, int, int, int, SecureMemArgs*) |
- asm("playground$process_exit"); |
- #if defined(__NR_getsockopt) |
- STATIC bool process_getsockopt(int, int, int, int, SecureMemArgs*) |
- asm("playground$process_getsockopt"); |
- #endif |
- STATIC bool process_ioctl(int, int, int, int, SecureMemArgs*) |
- asm("playground$process_ioctl"); |
- #if defined(__NR_ipc) |
- STATIC bool process_ipc(int, int, int, int, SecureMemArgs*) |
- asm("playground$process_ipc"); |
- #endif |
- STATIC bool process_madvise(int, int, int, int, SecureMemArgs*) |
- asm("playground$process_madvise"); |
- STATIC bool process_mmap(int, int, int, int, SecureMemArgs*) |
- asm("playground$process_mmap"); |
- STATIC bool process_mprotect(int, int, int, int, SecureMemArgs*) |
- asm("playground$process_mprotect"); |
- STATIC bool process_munmap(int, int, int, int, SecureMemArgs*) |
- asm("playground$process_munmap"); |
- STATIC bool process_open(int, int, int, int, SecureMemArgs*) |
- asm("playground$process_open"); |
- #if defined(__NR_recvfrom) |
- STATIC bool process_recvfrom(int, int, int, int, SecureMemArgs*) |
- asm("playground$process_recvfrom"); |
- STATIC bool process_recvmsg(int, int, int, int, SecureMemArgs*) |
- asm("playground$process_recvmsg"); |
- STATIC bool process_sendmsg(int, int, int, int, SecureMemArgs*) |
- asm("playground$process_sendmsg"); |
- STATIC bool process_sendto(int, int, int, int, SecureMemArgs*) |
- asm("playground$process_sendto"); |
- STATIC bool process_setsockopt(int, int, int, int, SecureMemArgs*) |
- asm("playground$process_setsockopt"); |
- #endif |
- #if defined(__NR_shmat) |
- STATIC bool process_shmat(int, int, int, int, SecureMemArgs*) |
- asm("playground$process_shmat"); |
- STATIC bool process_shmctl(int, int, int, int, SecureMemArgs*) |
- asm("playground$process_shmctl"); |
- STATIC bool process_shmdt(int, int, int, int, SecureMemArgs*) |
- asm("playground$process_shmdt"); |
- STATIC bool process_shmget(int, int, int, int, SecureMemArgs*) |
- asm("playground$process_shmget"); |
- #endif |
- STATIC bool process_sigaction(int, int, int, int, SecureMemArgs*) |
- asm("playground$process_sigaction"); |
- #if defined(__NR_socketcall) |
- STATIC bool process_socketcall(int, int, int, int, SecureMemArgs*) |
- asm("playground$process_socketcall"); |
- #endif |
- STATIC bool process_stat(int, int, int, int, SecureMemArgs*) |
- asm("playground$process_stat"); |
- |
-#ifdef __cplusplus |
- friend class Debug; |
- friend class Library; |
- friend class Maps; |
- friend class Mutex; |
- friend class SecureMem; |
- friend class TLS; |
- |
- // Define our own inline system calls. These calls will not be rewritten |
- // to point to the sandboxed wrapper functions. They thus allow us to |
- // make actual system calls (e.g. in the sandbox initialization code, and |
- // in the trusted process) |
- class SysCalls { |
- public: |
- #define SYS_CPLUSPLUS |
- #define SYS_ERRNO my_errno |
- #define SYS_INLINE inline |
- #define SYS_PREFIX -1 |
- #undef SYS_LINUX_SYSCALL_SUPPORT_H |
- #include "linux_syscall_support.h" |
- SysCalls() : my_errno(0) { } |
- int my_errno; |
- }; |
- #ifdef __NR_mmap2 |
- #define MMAP mmap2 |
- #define __NR_MMAP __NR_mmap2 |
- #else |
- #define MMAP mmap |
- #define __NR_MMAP __NR_mmap |
- #endif |
- |
- // Print an error message and terminate the program. Used for fatal errors. |
- static void die(const char *msg = 0) __attribute__((noreturn)) { |
- SysCalls sys; |
- if (msg) { |
- sys.write(2, msg, strlen(msg)); |
- sys.write(2, "\n", 1); |
- } |
- for (;;) { |
- sys.exit_group(1); |
- sys._exit(1); |
- } |
- } |
- |
- // Wrapper around "read()" that can deal with partial and interrupted reads |
- // and that does not modify the global errno variable. |
- static ssize_t read(SysCalls& sys, int fd, void* buf, size_t len) { |
- if (static_cast<ssize_t>(len) < 0) { |
- sys.my_errno = EINVAL; |
- return -1; |
- } |
- size_t offset = 0; |
- while (offset < len) { |
- ssize_t partial = |
- NOINTR_SYS(sys.read(fd, reinterpret_cast<char*>(buf) + offset, |
- len - offset)); |
- if (partial < 0) { |
- return partial; |
- } else if (!partial) { |
- break; |
- } |
- offset += partial; |
- } |
- return offset; |
- } |
- |
- // Wrapper around "write()" that can deal with interrupted writes and that |
- // does not modify the global errno variable. |
- static ssize_t write(SysCalls& sys, int fd, const void* buf, size_t len){ |
- return NOINTR_SYS(sys.write(fd, buf, len)); |
- } |
- |
- // Sends a file handle to another process. |
- // N.B. trusted_thread.cc has an assembly version of this function that |
- // is safe to use without a call stack. If the wire-format is changed, |
- /// make sure to update the assembly code. |
- static bool sendFd(int transport, int fd0, int fd1, const void* buf, |
- size_t len); |
- |
- // If getFd() fails, it will set the first valid fd slot (e.g. fd0) to |
- // -errno. |
- static bool getFd(int transport, int* fd0, int* fd1, void* buf, |
- size_t* len); |
- |
- // Data structures used to forward system calls to the trusted process. |
- struct Accept { |
- int sockfd; |
- void* addr; |
- socklen_t* addrlen; |
- } __attribute__((packed)); |
- |
- struct Accept4 { |
- int sockfd; |
- void* addr; |
- socklen_t* addrlen; |
- int flags; |
- } __attribute__((packed)); |
- |
- struct Access { |
- size_t path_length; |
- int mode; |
- } __attribute__((packed)); |
- |
- struct Bind { |
- int sockfd; |
- void* addr; |
- socklen_t addrlen; |
- } __attribute__((packed)); |
- |
- struct Clone { |
- int flags; |
- char* stack; |
- int* pid; |
- int* ctid; |
- void* tls; |
- #if defined(__x86_64__) |
- struct { |
- void* r15; |
- void* r14; |
- void* r13; |
- void* r12; |
- void* r11; |
- void* r10; |
- void* r9; |
- void* r8; |
- void* rdi; |
- void* rsi; |
- void* rdx; |
- void* rcx; |
- void* rbx; |
- void* rbp; |
- void* fake_ret; |
- } regs64 __attribute__((packed)); |
- #elif defined(__i386__) |
- struct { |
- void* ebp; |
- void* edi; |
- void* esi; |
- void* edx; |
- void* ecx; |
- void* ebx; |
- } regs32 __attribute__((packed)); |
- #else |
- #error Unsupported target platform |
- #endif |
- void* ret; |
- } __attribute__((packed)); |
- |
- struct Connect { |
- int sockfd; |
- void* addr; |
- socklen_t addrlen; |
- } __attribute__((packed)); |
- |
- struct GetSockName { |
- int sockfd; |
- void* name; |
- socklen_t* namelen; |
- } __attribute__((packed)); |
- |
- struct GetPeerName { |
- int sockfd; |
- void* name; |
- socklen_t* namelen; |
- } __attribute__((packed)); |
- |
- struct GetSockOpt { |
- int sockfd; |
- int level; |
- int optname; |
- void* optval; |
- socklen_t* optlen; |
- } __attribute__((packed)); |
- |
- struct IOCtl { |
- int d; |
- int req; |
- void *arg; |
- } __attribute__((packed)); |
- |
- #if defined(__NR_ipc) |
- struct IPC { |
- unsigned call; |
- int first; |
- int second; |
- int third; |
- void* ptr; |
- long fifth; |
- } __attribute__((packed)); |
- #endif |
- |
- struct Listen { |
- int sockfd; |
- int backlog; |
- } __attribute__((packed)); |
- |
- struct MAdvise { |
- const void* start; |
- size_t len; |
- int advice; |
- } __attribute__((packed)); |
- |
- struct MMap { |
- void* start; |
- size_t length; |
- int prot; |
- int flags; |
- int fd; |
- off_t offset; |
- } __attribute__((packed)); |
- |
- struct MProtect { |
- const void* addr; |
- size_t len; |
- int prot; |
- }; |
- |
- struct MUnmap { |
- void* start; |
- size_t length; |
- } __attribute__((packed)); |
- |
- struct Open { |
- size_t path_length; |
- int flags; |
- mode_t mode; |
- } __attribute__((packed)); |
- |
- struct Recv { |
- int sockfd; |
- void* buf; |
- size_t len; |
- int flags; |
- } __attribute__((packed)); |
- |
- struct RecvFrom { |
- int sockfd; |
- void* buf; |
- size_t len; |
- int flags; |
- void* from; |
- socklen_t *fromlen; |
- } __attribute__((packed)); |
- |
- struct RecvMsg { |
- int sockfd; |
- struct msghdr* msg; |
- int flags; |
- } __attribute__((packed)); |
- |
- struct Send { |
- int sockfd; |
- const void* buf; |
- size_t len; |
- int flags; |
- } __attribute__((packed)); |
- |
- struct SendMsg { |
- int sockfd; |
- const struct msghdr* msg; |
- int flags; |
- } __attribute__((packed)); |
- |
- struct SendTo { |
- int sockfd; |
- const void* buf; |
- size_t len; |
- int flags; |
- const void* to; |
- socklen_t tolen; |
- } __attribute__((packed)); |
- |
- struct SetSockOpt { |
- int sockfd; |
- int level; |
- int optname; |
- const void* optval; |
- socklen_t optlen; |
- } __attribute__((packed)); |
- |
- #if defined(__NR_shmat) |
- struct ShmAt { |
- int shmid; |
- const void* shmaddr; |
- int shmflg; |
- } __attribute__((packed)); |
- |
- struct ShmCtl { |
- int shmid; |
- int cmd; |
- void *buf; |
- } __attribute__((packed)); |
- |
- struct ShmDt { |
- const void *shmaddr; |
- } __attribute__((packed)); |
- |
- struct ShmGet { |
- int key; |
- size_t size; |
- int shmflg; |
- } __attribute__((packed)); |
- #endif |
- |
- struct ShutDown { |
- int sockfd; |
- int how; |
- } __attribute__((packed)); |
- |
- struct SigAction { |
- int sysnum; |
- int signum; |
- const SysCalls::kernel_sigaction* action; |
- const SysCalls::kernel_sigaction* old_action; |
- size_t sigsetsize; |
- } __attribute__((packed)); |
- |
- struct Socket { |
- int domain; |
- int type; |
- int protocol; |
- } __attribute__((packed)); |
- |
- struct SocketPair { |
- int domain; |
- int type; |
- int protocol; |
- int* pair; |
- } __attribute__((packed)); |
- |
- #if defined(__NR_socketcall) |
- struct SocketCall { |
- int call; |
- void* arg_ptr; |
- union { |
- Socket socket; |
- Bind bind; |
- Connect connect; |
- Listen listen; |
- Accept accept; |
- GetSockName getsockname; |
- GetPeerName getpeername; |
- SocketPair socketpair; |
- Send send; |
- Recv recv; |
- SendTo sendto; |
- RecvFrom recvfrom; |
- ShutDown shutdown; |
- SetSockOpt setsockopt; |
- GetSockOpt getsockopt; |
- SendMsg sendmsg; |
- RecvMsg recvmsg; |
- Accept4 accept4; |
- } args; |
- } __attribute__((packed)); |
- #endif |
- |
- struct Stat { |
- int sysnum; |
- size_t path_length; |
- void* buf; |
- } __attribute__((packed)); |
- |
- // Thread local data available from each sandboxed thread. |
- enum { TLS_COOKIE, TLS_TID, TLS_THREAD_FD }; |
- static long long cookie() { return TLS::getTLSValue<long long>(TLS_COOKIE); } |
- static int tid() { return TLS::getTLSValue<int>(TLS_TID); } |
- static int threadFdPub() { return TLS::getTLSValue<int>(TLS_THREAD_FD); } |
- static int processFdPub() { return processFdPub_; } |
- static kernel_sigset_t* signalMask() { return &getSecureMem()->signalMask; } |
- |
- // The SEGV handler knows how to handle RDTSC instructions |
- static void setupSignalHandlers(); |
- static void (*segv())(int signo, SysCalls::siginfo *context, void *unused); |
- |
- // If no specific handler has been registered for a system call, call this |
- // function which asks the trusted thread to perform the call. This is used |
- // for system calls that are not restricted. |
- static void* defaultSystemCallHandler(int syscallNum, void* arg0, |
- void* arg1, void* arg2, void* arg3, |
- void* arg4, void* arg5) |
- asm("playground$defaultSystemCallHandler") |
- #if defined(__x86_64__) |
- __attribute__((visibility("internal"))) |
- #endif |
- ; |
- |
- // Return the current secure memory structure for this thread. |
- static SecureMem::Args* getSecureMem(); |
- |
- // Return a secure memory structure that can be used by a newly created |
- // thread. |
- static SecureMem::Args* getNewSecureMem(); |
- |
- // This functions runs in the trusted process at startup and finds all the |
- // memory mappings that existed when the sandbox was first enabled. Going |
- // forward, all these mappings are off-limits for operations such as |
- // mmap(), munmap(), and mprotect(). |
- static int initializeProtectedMap(int fd); |
- |
- // Helper functions that allows the trusted process to get access to |
- // "/proc/self/maps" in the sandbox. |
- static void snapshotMemoryMappings(int processFd, int proc_self_maps); |
- |
- // Main loop for the trusted process. |
- static void trustedProcess(int parentMapsFd, int processFdPub, |
- int sandboxFd, int cloneFd, |
- SecureMem::Args* secureArena) |
- __attribute__((noreturn)); |
- |
- // Fork()s of the trusted process. |
- static SecureMem::Args* createTrustedProcess(int processFdPub, int sandboxFd, |
- int cloneFdPub, int cloneFd); |
- |
- // Creates the trusted thread for the initial thread, then enables |
- // Seccomp mode. |
- static void createTrustedThread(int processFdPub, int cloneFdPub, |
- SecureMem::Args* secureMem); |
- |
- static int proc_self_maps_; |
- static enum SandboxStatus { |
- STATUS_UNKNOWN, STATUS_UNSUPPORTED, STATUS_AVAILABLE, STATUS_ENABLED |
- } status_; |
- static int pid_; |
- static int processFdPub_; |
- static int cloneFdPub_; |
- |
- #ifdef __i386__ |
- struct SocketCallArgInfo; |
- static const struct SocketCallArgInfo socketCallArgInfo[]; |
- #endif |
- |
- // We always have to intercept SIGSEGV. If the application wants to set its |
- // own SEGV handler, we forward to it whenever necessary. |
- static SysCalls::kernel_sigaction sa_segv_ asm("playground$sa_segv"); |
- |
- // The syscall_mutex_ can only be directly accessed by the trusted process. |
- // It can be accessed by the trusted thread after fork()ing and calling |
- // mprotect(PROT_READ|PROT_WRITE). The mutex is used for system calls that |
- // require passing additional data, and that require the trusted process to |
- // wait until the trusted thread is done processing (e.g. exit(), clone(), |
- // open(), stat()) |
- static int syscall_mutex_ asm("playground$syscall_mutex"); |
- |
- // Available in trusted process, only |
- typedef std::map<void *, long> ProtectedMap; |
- static ProtectedMap protectedMap_; |
- static std::vector<SecureMem::Args*> secureMemPool_; |
-}; |
- |
-// If this struct is extended to contain parameters that are read by |
-// the trusted thread, we will have to mprotect() it to be read-only when |
-// starting the sandbox. However, currently it is read only by the |
-// trusted process, and the sandboxed process cannot change the values |
-// that the fork()'d trusted process sees. |
-struct SandboxPolicy { |
- bool allow_file_namespace; // Allow filename-based system calls. |
-}; |
- |
-extern struct SandboxPolicy g_policy; |
- |
-} // namespace |
- |
-using playground::Sandbox; |
-#endif // __cplusplus |
- |
-#endif // SANDBOX_IMPL_H__ |