aboutsummaryrefslogtreecommitdiff
path: root/signal_handler.c
diff options
context:
space:
mode:
authorJorge Lucangeli Obes <jorgelo@google.com>2015-07-15 16:22:34 -0700
committerJorge Lucangeli Obes <jorgelo@google.com>2015-07-18 17:19:29 -0700
commita21c8fc135523df5bbd4523b36096dff6e8ade4a (patch)
tree82f4db557f29eb8adef1742f917c7e5186dedeb7 /signal_handler.c
parent1b148898c5e1f90a847c809ad7d9a298f6bea415 (diff)
downloadminijail-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.c73
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;
+}