#include "config.h"
#include "Syscall.h"
#if ENABLE(SECCOMP_FILTERS)
#include "ArgumentCoders.h"
#include "OpenSyscall.h"
#include "SigactionSyscall.h"
#include "SigprocmaskSyscall.h"
#include <seccomp.h>
namespace WebKit {
PassOwnPtr<Syscall> Syscall::createFromContext(ucontext_t* ucontext)
{
mcontext_t* mcontext = &ucontext->uc_mcontext;
switch (mcontext->gregs[REG_SYSCALL]) {
case __NR_open:
return adoptPtr(new OpenSyscall(mcontext));
case __NR_openat:
return OpenSyscall::createFromOpenatContext(mcontext);
case __NR_creat:
return OpenSyscall::createFromCreatContext(mcontext);
case __NR_sigprocmask:
case __NR_rt_sigprocmask:
return SigprocmaskSyscall::createFromContext(ucontext);
case __NR_sigaction:
case __NR_rt_sigaction:
return SigactionSyscall::createFromContext(mcontext);
default:
CRASH();
}
return nullptr;
}
PassOwnPtr<Syscall> Syscall::createFromDecoder(CoreIPC::ArgumentDecoder* decoder)
{
int type;
if (!decoder->decode(type))
return nullptr;
OwnPtr<Syscall> syscall;
if (type == __NR_open)
syscall = adoptPtr(new OpenSyscall(0));
if (!syscall->decode(decoder))
return nullptr;
return syscall.release();
}
Syscall::Syscall(int type, mcontext_t* context)
: m_type(type)
, m_context(context)
{
}
PassOwnPtr<SyscallResult> SyscallResult::createFromDecoder(CoreIPC::ArgumentDecoder* decoder, int fd)
{
int type;
if (!decoder->decode(type))
return nullptr;
OwnPtr<SyscallResult> result;
if (type == __NR_open)
result = adoptPtr(new OpenSyscallResult(-1, 0));
if (!result->decode(decoder, fd))
return nullptr;
return result.release();
}
SyscallResult::SyscallResult(int type)
: m_type(type)
{
}
}
#endif // ENABLE(SECCOMP_FILTERS)