blob: 85103c7c8ad9467d4a96a92db2af2bade8b2b5cb [file] [log] [blame]
Jorge Lucangeli Obesbda833c2012-07-31 16:25:56 -07001/* Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
2 * Use of this source code is governed by a BSD-style license that can be
3 * found in the LICENSE file.
4 */
5
6#include <asm/siginfo.h>
7#define __have_siginfo_t 1
8#define __have_sigval_t 1
9#define __have_sigevent_t 1
10
11#include <signal.h>
12#include <stdlib.h>
13#include <string.h>
14#include <unistd.h>
15
16#include "signal.h"
17
18#include "util.h"
19
20struct local_sigsys {
21 void *ip;
22 int nr;
23 unsigned int arch;
24};
25
26void log_sigsys_handler(int nr, siginfo_t *info, void *void_context)
27{
28 struct local_sigsys sigsys;
29 const char *syscall_name;
30 memcpy(&sigsys, &info->_sifields, sizeof(sigsys));
31 syscall_name = lookup_syscall_name(sigsys.nr);
32
33 if (syscall_name)
34 warn("blocked syscall: %s", syscall_name);
35 else
36 warn("blocked syscall: %d", nr);
37
38 (void) void_context;
39
40 /*
41 * We trapped on a syscall that should have killed the process.
42 * This should never ever return, but we're paranoid.
43 */
44 for (;;)
45 _exit(1);
46}
47
48int install_sigsys_handler()
49{
50 int ret = 0;
51 struct sigaction act;
52 sigset_t mask;
53
54 memset(&act, 0, sizeof(act));
55 act.sa_sigaction = &log_sigsys_handler;
56 act.sa_flags = SA_SIGINFO;
57
58 sigemptyset(&mask);
59 sigaddset(&mask, SIGSYS);
60
61 ret = sigaction(SIGSYS, &act, NULL);
62 if (ret < 0)
63 return ret;
64
65 ret = sigprocmask(SIG_UNBLOCK, &mask, NULL);
66 if (ret < 0)
67 return ret;
68
69 return 0;
70}