You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
73 lines
1.5 KiB
73 lines
1.5 KiB
/* Copyright (c) 2012 The Chromium OS Authors. All rights reserved. |
|
* Use of this source code is governed by a BSD-style license that can be |
|
* found in the LICENSE file. |
|
*/ |
|
|
|
/* These header files need to be included before asm/siginfo.h such that |
|
* pid_t, timer_t, and clock_t are defined. */ |
|
#include <stdlib.h> |
|
#include <unistd.h> |
|
|
|
#include <asm/siginfo.h> |
|
#define __have_siginfo_t 1 |
|
#define __have_sigval_t 1 |
|
#define __have_sigevent_t 1 |
|
|
|
#include <signal.h> |
|
#include <string.h> |
|
|
|
#include "signal_handler.h" |
|
|
|
#include "util.h" |
|
|
|
struct local_sigsys { |
|
void *ip; |
|
int nr; |
|
unsigned int arch; |
|
}; |
|
|
|
void log_sigsys_handler(int nr, siginfo_t *info, void *void_context) |
|
{ |
|
struct local_sigsys sigsys; |
|
const char *syscall_name; |
|
memcpy(&sigsys, &info->_sifields, sizeof(sigsys)); |
|
syscall_name = lookup_syscall_name(sigsys.nr); |
|
|
|
(void) void_context; |
|
|
|
if (syscall_name) |
|
die("blocked syscall: %s", syscall_name); |
|
else |
|
die("blocked syscall: %d", nr); |
|
|
|
/* |
|
* We trapped on a syscall that should have killed the process. |
|
* This should never ever return, but we're paranoid. |
|
*/ |
|
for (;;) |
|
_exit(1); |
|
} |
|
|
|
int install_sigsys_handler() |
|
{ |
|
int ret = 0; |
|
struct sigaction act; |
|
sigset_t mask; |
|
|
|
memset(&act, 0, sizeof(act)); |
|
act.sa_sigaction = &log_sigsys_handler; |
|
act.sa_flags = SA_SIGINFO; |
|
|
|
sigemptyset(&mask); |
|
sigaddset(&mask, SIGSYS); |
|
|
|
ret = sigaction(SIGSYS, &act, NULL); |
|
if (ret < 0) |
|
return ret; |
|
|
|
ret = sigprocmask(SIG_UNBLOCK, &mask, NULL); |
|
if (ret < 0) |
|
return ret; |
|
|
|
return 0; |
|
}
|
|
|