diff options
author | Jorge Lucangeli Obes <jorgelo@google.com> | 2015-07-15 16:22:34 -0700 |
---|---|---|
committer | Jorge Lucangeli Obes <jorgelo@google.com> | 2015-07-18 17:19:29 -0700 |
commit | a21c8fc135523df5bbd4523b36096dff6e8ade4a (patch) | |
tree | 82f4db557f29eb8adef1742f917c7e5186dedeb7 /signal_handler.c | |
parent | 1b148898c5e1f90a847c809ad7d9a298f6bea415 (diff) | |
download | minijail-a21c8fc135523df5bbd4523b36096dff6e8ade4a.tar.gz |
Add 'Android.mk' file, fix compile on Android.
This requires disabling LDPRELOAD and temporarily disabling
capabilities support.
Reland of https://android-review.googlesource.com/#/c/159755/
with compile fixes. Compile-tested on
aosp_{x86,x86_64,arm,arm64,mips64}-eng.
Bug: 22487289
Change-Id: Ia4530cf09b074aa0a2afe5a5b307ff3c5c5d6c08
Diffstat (limited to 'signal_handler.c')
-rw-r--r-- | signal_handler.c | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/signal_handler.c b/signal_handler.c new file mode 100644 index 0000000..dd0ea4f --- /dev/null +++ b/signal_handler.c @@ -0,0 +1,73 @@ +/* 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); + + if (syscall_name) + warn("blocked syscall: %s", syscall_name); + else + warn("blocked syscall: %d", nr); + + (void) void_context; + + /* + * 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; +} |