#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 {
std::unique_ptr<Syscall> Syscall::createFromContext(ucontext_t* ucontext)
{
mcontext_t* mcontext = &ucontext->uc_mcontext;
switch (mcontext->gregs[REG_SYSCALL]) {
case __NR_open:
return std::make_unique<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;
}
std::unique_ptr<Syscall> Syscall::createFromDecoder(IPC::ArgumentDecoder* decoder)
{
int type;
if (!decoder->decode(type))
return nullptr;
std::unique_ptr<Syscall> syscall;
if (type == __NR_open)
syscall = std::make_unique<OpenSyscall>(nullptr);
if (!syscall->decode(decoder))
return nullptr;
return syscall;
}
Syscall::Syscall(int type, mcontext_t* context)
: m_type(type)
, m_context(context)
{
}
std::unique_ptr<SyscallResult> SyscallResult::createFromDecoder(IPC::ArgumentDecoder* decoder, int fd)
{
int type;
if (!decoder->decode(type))
return nullptr;
std::unique_ptr<SyscallResult> result;
if (type == __NR_open)
result = std::make_unique<OpenSyscallResult>(-1, 0);
if (!result->decode(decoder, fd))
return nullptr;
return result;
}
SyscallResult::SyscallResult(int type)
: m_type(type)
{
}
}
#endif // ENABLE(SECCOMP_FILTERS)