diff options
Diffstat (limited to 'standalone')
4 files changed, 39 insertions, 20 deletions
diff --git a/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/Makefile b/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/Makefile index aef1bd3..93e1539 100644 --- a/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/Makefile +++ b/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/Makefile @@ -74,7 +74,7 @@ lib_timing.so: c_timing.c $(CC) -o $@ -shared $(CFLAGS) -Wl,-soname,lib_timing.so $< lib_signals.so: c_signals.c - $(CC) -o $@ -shared $(CFLAGS) -Wl,-soname,lib_signals.so $< + $(CC) -o $@ -shared $(CFLAGS) -pthread -lpthread -Wl,-soname,lib_signals.so $< cpp_utils.o: cpp_utils.cpp $(CXX) $(CXXFLAGS) -c $< @@ -107,7 +107,7 @@ boringssl.o: boringssl.c gcrypt: gcrypt_provider.so gcrypt_provider.so: gcrypt.o c_utils.o | lib_timing.so lib_signals.so - $(CC) $(LFLAGS) -o $@ -Wl,-rpath,'$$ORIGIN/lib' $^ -L. $(shell libgcrypt-config --libs) -l:lib_timing.so -l:lib_signals.so + $(CC) $(LFLAGS) -o $@ -Wl,-rpath,'$$ORIGIN/lib' $^ -L. -pthread -lpthread $(shell libgcrypt-config --libs) -l:lib_timing.so -l:lib_signals.so gcrypt.o: gcrypt.c $(CC) $(shell libgcrypt-config --cflags) $(CFLAGS) -c $< diff --git a/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/c_signals.c b/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/c_signals.c index f4adaa5..a1ea9f1 100644 --- a/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/c_signals.c +++ b/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/c_signals.c @@ -6,29 +6,38 @@ #include <signal.h> #include <setjmp.h> #include <stdbool.h> - -// TODO: Handle alarms properly. -// Create a new thread, make it sleep, then send alarm to the main thread. +#include <pthread.h> +#include <unistd.h> static siginfo_t last_siginfo; static bool initialized = false; static bool caught = false; static bool timedout = false; -static jmp_buf *target = NULL; +static sigjmp_buf buf; +static sigjmp_buf *target = NULL; + +struct timer_arg { + unsigned int timeout; + pthread_t main_thread; +}; +static struct timer_arg ta; +static pthread_t timer_thread; void handler(int signo, siginfo_t *info, void *context) { + //printf("Signal, %i\n", signo); last_siginfo = *info; caught = true; - longjmp(*target, 1); + siglongjmp(*target, 1); } void alarm_handler(int signo) { + //printf("Alarm\n"); timedout = true; + siglongjmp(*target, 1); } -static jmp_buf buf; -jmp_buf *get_jmpbuf() { +sigjmp_buf *get_jmpbuf() { return &buf; } @@ -36,7 +45,14 @@ static struct sigaction old_segv; static struct sigaction old_abrt; static struct sigaction old_alrm; -void init_signals(jmp_buf *env) { +void *timer(void *arg) { + sleep(ta.timeout); + pthread_kill(ta.main_thread, SIGALRM); + return NULL; +} + +void init_signals(sigjmp_buf *env, unsigned int timeout) { + //printf("Initializing signals!\n"); struct sigaction action; action.sa_sigaction = handler; sigemptyset(&action.sa_mask); @@ -55,10 +71,18 @@ void init_signals(jmp_buf *env) { initialized = true; caught = false; timedout = false; + + ta.timeout = timeout; + ta.main_thread = pthread_self(); + + pthread_create(&timer_thread, NULL, timer, (void *)&ta); } void deinit_signals() { + //printf("Deinitializing signals!\n"); + pthread_cancel(timer_thread); + sigaction(SIGSEGV, NULL, &old_segv); sigaction(SIGABRT, NULL, &old_abrt); sigaction(SIGALRM, NULL, &old_alrm); diff --git a/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/c_signals.h b/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/c_signals.h index 95fc693..dec7223 100644 --- a/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/c_signals.h +++ b/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/c_signals.h @@ -2,6 +2,7 @@ #include <jni.h> #include <setjmp.h> +#include <signal.h> #ifdef __cplusplus extern "C" @@ -11,12 +12,12 @@ extern "C" /** * */ -void init_signals(jmp_buf *env); +void init_signals(jmp_buf *env, unsigned int timeout); /** * */ -jmp_buf *get_jmpbuf(); +sigjmp_buf *get_jmpbuf(); /** * @@ -34,8 +35,8 @@ bool get_timedout(); jobject get_siginfo(JNIEnv *env); -#define SIG_TRY() init_signals(get_jmpbuf()); \ - if (!setjmp(*get_jmpbuf())) +#define SIG_TRY(timeout) init_signals(get_jmpbuf(), timeout); \ + if (!sigsetjmp(*get_jmpbuf(), 1)) #define SIG_CATCH() deinit_signals(); #define SIG_HANDLE(env) do { \ jobject siginfo = get_siginfo(env); \ diff --git a/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/gcrypt.c b/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/gcrypt.c index 3df7656..3ddaef4 100644 --- a/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/gcrypt.c +++ b/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/gcrypt.c @@ -277,12 +277,6 @@ static jobject generate_from_sexp(JNIEnv *env, gcry_sexp_t gen_sexp) { gcry_error_t err = gcry_pk_genkey(&key_sexp, gen_sexp); native_timing_stop(); - SIG_TRY() { - //raise(SIGSEGV); - } SIG_CATCH(); - - SIG_HANDLE(env); - if (gcry_err_code(err) != GPG_ERR_NO_ERROR) { throw_new_var(env, "java/security/GeneralSecurityException", "Error generating key. Error: %ui", gcry_err_code(err)); goto release_sexp; |
