From a304874319225eabbb8bae3aa96004f384732ccc Mon Sep 17 00:00:00 2001 From: Tobias Brunner Date: Tue, 7 Aug 2012 15:30:49 +0200 Subject: [PATCH] Add signal handler for fatal signals to libandroidbridge --- .../jni/libandroidbridge/charonservice.c | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/src/frontends/android/jni/libandroidbridge/charonservice.c b/src/frontends/android/jni/libandroidbridge/charonservice.c index bbd5f5891..671561f5f 100644 --- a/src/frontends/android/jni/libandroidbridge/charonservice.c +++ b/src/frontends/android/jni/libandroidbridge/charonservice.c @@ -15,6 +15,7 @@ * for more details. */ +#include #include #include @@ -25,6 +26,7 @@ #include #include #include +#include #define ANDROID_DEBUG_LEVEL 1 @@ -109,11 +111,23 @@ static void charonservice_deinit() charonservice = NULL; } +/** + * Handle SIGSEGV/SIGILL signals raised by threads + */ +static void segv_handler(int signal) +{ + dbg_android(DBG_DMN, 1, "thread %u received %d", thread_current_id(), + signal); + exit(1); +} + /** * Initialize charon and the libraries via JNI */ JNI_METHOD(CharonVpnService, initializeCharon, void) { + struct sigaction action; + /* logging for library during initialization, as we have no bus yet */ dbg = dbg_android; @@ -152,6 +166,16 @@ JNI_METHOD(CharonVpnService, initializeCharon, void) return; } + /* add handler for SEGV and ILL etc. */ + action.sa_handler = segv_handler; + action.sa_flags = 0; + sigemptyset(&action.sa_mask); + sigaction(SIGSEGV, &action, NULL); + sigaction(SIGILL, &action, NULL); + sigaction(SIGBUS, &action, NULL); + action.sa_handler = SIG_IGN; + sigaction(SIGPIPE, &action, NULL); + /* start daemon (i.e. the threads in the thread-pool) */ charon->start(charon); }