code-intelligence.com/cifuzz@v0.40.0/third-party/minijail/signal_handler.c (about) 1 /* 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 <signal.h> 7 #include <stdlib.h> 8 #include <string.h> 9 #include <unistd.h> 10 11 #include "signal_handler.h" 12 13 #include "util.h" 14 15 /* 16 * si_syscall was added in glibc-2.17+, but Android still uses glibc-2.15 17 * for its prebuilt binary host toolchains. Add a compat hack for it. 18 */ 19 static int get_si_syscall(const siginfo_t *info) 20 { 21 #if defined(si_syscall) 22 return info->si_syscall; 23 #endif 24 25 typedef struct { 26 void *ip; 27 int nr; 28 unsigned int arch; 29 } local_siginfo_t; 30 31 union { 32 const siginfo_t *info; 33 const local_siginfo_t *local_info; 34 } local_info = { 35 .info = info, 36 }; 37 return local_info.local_info->nr; 38 } 39 40 void log_sigsys_handler(int sig attribute_unused, siginfo_t *info, 41 void *void_context attribute_unused) 42 { 43 const char *syscall_name; 44 int nr = get_si_syscall(info); 45 syscall_name = lookup_syscall_name(nr); 46 47 if (syscall_name) 48 die("blocked syscall: %s", syscall_name); 49 else 50 die("blocked syscall: %d", nr); 51 52 /* 53 * We trapped on a syscall that should have killed the process. 54 * This should never ever return, but we're paranoid. 55 */ 56 for (;;) 57 _exit(1); 58 } 59 60 int install_sigsys_handler() 61 { 62 int ret = 0; 63 struct sigaction act; 64 sigset_t mask; 65 66 memset(&act, 0, sizeof(act)); 67 act.sa_sigaction = &log_sigsys_handler; 68 act.sa_flags = SA_SIGINFO; 69 70 sigemptyset(&mask); 71 sigaddset(&mask, SIGSYS); 72 73 ret = sigaction(SIGSYS, &act, NULL); 74 if (ret < 0) 75 return ret; 76 77 ret = sigprocmask(SIG_UNBLOCK, &mask, NULL); 78 if (ret < 0) 79 return ret; 80 81 return 0; 82 }