aboutsummaryrefslogtreecommitdiff
path: root/standalone
diff options
context:
space:
mode:
Diffstat (limited to 'standalone')
-rw-r--r--standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/Makefile4
-rw-r--r--standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/c_signals.c40
-rw-r--r--standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/c_signals.h9
-rw-r--r--standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/gcrypt.c6
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;