struct
sigaction act = { 0 };
act.sa_flags = SA_SIGINFO | SA_NODEFER;
act.sa_sigaction = handleSignalAction;
struct
sigaction old_sa = {};
ret = sigaction(SIGSYS, &act, &old_sa);
if
(0 != ret) {
LOGSVCE(
"sigaction: %d, %d, %s"
, ret,
errno
,
strerror
(
errno
))
::
free
(filter);
__ASSERT(0)
return
-11;
}
sigset_t mask;
if
(sigemptyset(&mask) || sigaddset(&mask, SIGSYS) ||
sigprocmask(SIG_UNBLOCK, &mask, nullptr)
) {
LOGSVCE(
"sigprocmask: %d, %d, %s"
, ret,
errno
,
strerror
(
errno
))
::
free
(filter);
__ASSERT(0)
return
-12;
}
struct
sock_fprog prog = {
.len = filterCount,
.filter = filter,
};
ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
if
(0 != ret) {
LOGSVCE(
"PR_SET_NO_NEW_PRIVS: %d, %d, %s"
, ret,
errno
,
strerror
(
errno
))
::
free
(filter);
__ASSERT(0)
return
-13;
}
ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog);
if
(0 != ret) {
LOGSVCE(
"PR_SET_SECCOMP: %d, %d, %s"
, ret,
errno
,
strerror
(
errno
))
::
free
(filter);
__ASSERT(0)
return
-14;
}