From: Tobias Brunner Date: Tue, 7 Aug 2012 13:30:49 +0000 (+0200) Subject: Add signal handler for fatal signals to libandroidbridge X-Git-Tag: 5.0.1~210^2~60 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=a304874319225eabbb8bae3aa96004f384732ccc;p=thirdparty%2Fstrongswan.git Add signal handler for fatal signals to libandroidbridge --- diff --git a/src/frontends/android/jni/libandroidbridge/charonservice.c b/src/frontends/android/jni/libandroidbridge/charonservice.c index bbd5f58918..671561f5f6 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); }