aboutsummaryrefslogtreecommitdiff
path: root/standalone/src
diff options
context:
space:
mode:
authorJ08nY2024-05-07 17:53:43 +0200
committerJ08nY2024-05-07 17:53:43 +0200
commit2b80f0abca83172e586ca192e16db00b3951226a (patch)
tree1318507618a80d127f9d413ce750a9cf1cd62170 /standalone/src
parentca1be45c3e39a3d667b0d5a7023958487c8d55a2 (diff)
downloadECTester-2b80f0abca83172e586ca192e16db00b3951226a.tar.gz
ECTester-2b80f0abca83172e586ca192e16db00b3951226a.tar.zst
ECTester-2b80f0abca83172e586ca192e16db00b3951226a.zip
Diffstat (limited to 'standalone/src')
-rw-r--r--standalone/src/main/java/cz/crcs/ectester/standalone/ECTesterStandalone.java6
-rw-r--r--standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/Makefile47
-rw-r--r--standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/c_signals.h50
-rw-r--r--standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/cpp_signals.cpp122
-rw-r--r--standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/cpp_signals.hpp59
-rw-r--r--standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/cryptopp.cpp7
6 files changed, 228 insertions, 63 deletions
diff --git a/standalone/src/main/java/cz/crcs/ectester/standalone/ECTesterStandalone.java b/standalone/src/main/java/cz/crcs/ectester/standalone/ECTesterStandalone.java
index 82c2362..6ef1be7 100644
--- a/standalone/src/main/java/cz/crcs/ectester/standalone/ECTesterStandalone.java
+++ b/standalone/src/main/java/cz/crcs/ectester/standalone/ECTesterStandalone.java
@@ -106,8 +106,10 @@ public class ECTesterStandalone {
FileUtil.writeNewer(LIB_RESOURCE_DIR + "lib_timing.so", reqs.resolve("lib_timing.so"));
System.load(reqs.resolve("lib_timing.so").toString());
- FileUtil.writeNewer(LIB_RESOURCE_DIR + "lib_signals.so", reqs.resolve("lib_signals.so"));
- System.load(reqs.resolve("lib_signals.so").toString());
+ FileUtil.writeNewer(LIB_RESOURCE_DIR + "lib_csignals.so", reqs.resolve("lib_csignals.so"));
+ System.load(reqs.resolve("lib_csignals.so").toString());
+ FileUtil.writeNewer(LIB_RESOURCE_DIR + "lib_cppsignals.so", reqs.resolve("lib_cppsignals.so"));
+ System.load(reqs.resolve("lib_cppsignals.so").toString());
}
List<ProviderECLibrary> libObjects = new LinkedList<>();
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 2354194..6282574 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
@@ -73,8 +73,11 @@ c_utils.o: c_utils.c
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) -pthread -lpthread -Wl,-soname,lib_signals.so $<
+lib_csignals.so: c_signals.c
+ $(CC) -o $@ -shared $(CFLAGS) -pthread -lpthread -Wl,-soname,lib_csignals.so $<
+
+lib_cppsignals.so: cpp_signals.cpp
+ $(CC) -o $@ -shared $(CFLAGS) -pthread -lpthread -Wl,-soname,lib_cppsignals.so $<
cpp_utils.o: cpp_utils.cpp
$(CXX) $(CXXFLAGS) -c $<
@@ -83,8 +86,8 @@ cpp_utils.o: cpp_utils.cpp
# OpenSSL shim
openssl: openssl_provider.so
-openssl_provider.so: openssl.o c_utils.o | lib_timing.so lib_signals.so
- $(CC) $(LFLAGS) -o $@ -Wl,-rpath,'$$ORIGIN/lib' $^ -L. $(shell pkg-config --libs openssl) -l:lib_timing.so -l:lib_signals.so
+openssl_provider.so: openssl.o c_utils.o | lib_timing.so lib_csignals.so
+ $(CC) $(LFLAGS) -o $@ -Wl,-rpath,'$$ORIGIN/lib' $^ -L. $(shell pkg-config --libs openssl) -l:lib_timing.so -l:lib_csignals.so
openssl.o: openssl.c
$(CC) $(shell pkg-config --cflags openssl) $(CFLAGS) -c $<
@@ -96,8 +99,8 @@ boringssl: boringssl_provider.so
lib_boringssl.so:
cp $(PROJECT_ROOT_PATH)/ext/boringssl/build/crypto/libcrypto.so lib_boringssl.so
-boringssl_provider.so: boringssl.o c_utils.o | lib_timing.so lib_signals.so lib_boringssl.so
- $(CC) $(LFLAGS) -o $@ -Wl,-rpath,'$$ORIGIN/lib' $^ -L. lib_boringssl.so -l:lib_timing.so -l:lib_signals.so
+boringssl_provider.so: boringssl.o c_utils.o | lib_timing.so lib_csignals.so lib_boringssl.so
+ $(CC) $(LFLAGS) -o $@ -Wl,-rpath,'$$ORIGIN/lib' $^ -L. lib_boringssl.so -l:lib_timing.so -l:lib_csignals.so
boringssl.o: boringssl.c
$(CC) -I$(PROJECT_ROOT_PATH)/ext/boringssl/include/ $(CFLAGS) -c $<
@@ -106,8 +109,8 @@ boringssl.o: boringssl.c
# libgcrypt shim
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. -pthread -lpthread $(shell libgcrypt-config --libs) -l:lib_timing.so -l:lib_signals.so
+gcrypt_provider.so: gcrypt.o c_utils.o | lib_timing.so lib_csignals.so
+ $(CC) $(LFLAGS) -o $@ -Wl,-rpath,'$$ORIGIN/lib' $^ -L. -pthread -lpthread $(shell libgcrypt-config --libs) -l:lib_timing.so -l:lib_csignals.so
gcrypt.o: gcrypt.c
$(CC) $(shell libgcrypt-config --cflags) $(CFLAGS) -c $<
@@ -116,8 +119,8 @@ gcrypt.o: gcrypt.c
# Libtomcrypt shim
tomcrypt: tomcrypt_provider.so
-tomcrypt_provider.so: tomcrypt.o c_utils.o | lib_timing.so lib_signals.so
- $(CC) $(LFLAGS) -o $@ -Wl,-rpath,'$$ORIGIN/lib' $^ -L. -ltommath $(shell pkg-config --libs libtomcrypt) -l:lib_timing.so -l:lib_signals.so
+tomcrypt_provider.so: tomcrypt.o c_utils.o | lib_timing.so lib_csignals.so
+ $(CC) $(LFLAGS) -o $@ -Wl,-rpath,'$$ORIGIN/lib' $^ -L. -ltommath $(shell pkg-config --libs libtomcrypt) -l:lib_timing.so -l:lib_csignals.so
tomcrypt.o: tomcrypt.c
$(CC) -DLTM_DESC $(shell pkg-config --cflags libtomcrypt) $(CFLAGS) -c $<
@@ -126,8 +129,8 @@ tomcrypt.o: tomcrypt.c
# Botan-2 shim
botan: botan_provider.so
-botan_provider.so: botan.o cpp_utils.o | lib_timing.so lib_signals.so
- $(CXX) $(LFLAGS) -o $@ -Wl,-rpath,'$$ORIGIN/lib' $^ -L. $(shell pkg-config --libs botan-2) -l:lib_timing.so -l:lib_signals.so
+botan_provider.so: botan.o cpp_utils.o | lib_timing.so lib_cppsignals.so
+ $(CXX) $(LFLAGS) -o $@ -Wl,-rpath,'$$ORIGIN/lib' $^ -L. $(shell pkg-config --libs botan-2) -l:lib_timing.so -l:lib_cppsignals.so
botan.o: botan.cpp
$(CXX) $(shell pkg-config --cflags botan-2) $(CXXFLAGS) -c $<
@@ -140,8 +143,8 @@ ifeq ($(shell pkg-config --exists $(CRYPTOPP_NAME); echo $$?),1)
endif
cryptopp: cryptopp_provider.so
-cryptopp_provider.so: cryptopp.o cpp_utils.o | lib_timing.so lib_signals.so
- $(CXX) $(LFLAGS) -o $@ -Wl,-rpath,'$$ORIGIN/lib' $^ -L. $(shell pkg-config --libs $(CRYPTOPP_NAME)) -l:lib_timing.so -l:lib_signals.so
+cryptopp_provider.so: cryptopp.o cpp_utils.o | lib_timing.so lib_cppsignals.so
+ $(CXX) $(LFLAGS) -o $@ -Wl,-rpath,'$$ORIGIN/lib' $^ -L. $(shell pkg-config --libs $(CRYPTOPP_NAME)) -l:lib_timing.so -l:lib_cppsignals.so
cryptopp.o: cryptopp.cpp
$(CXX) $(shell pkg-config --cflags $(CRYPTOPP_NAME)) $(CXXFLAGS) -c $<
@@ -153,8 +156,8 @@ mbedtls: mbedtls_provider.so
lib_mbedtls.so:
cp $(PROJECT_ROOT_PATH)/ext/mbedtls/build/library/libmbedcrypto.so lib_mbedtls.so
-mbedtls_provider.so: mbedtls.o c_utils.o | lib_timing.so lib_signals.so lib_mbedtls.so
- $(CC) $(LFLAGS) -o $@ -Wl,-rpath,'$$ORIGIN/lib' $^ -L. lib_mbedtls.so -l:lib_timing.so -l:lib_signals.so
+mbedtls_provider.so: mbedtls.o c_utils.o | lib_timing.so lib_csignals.so lib_mbedtls.so
+ $(CC) $(LFLAGS) -o $@ -Wl,-rpath,'$$ORIGIN/lib' $^ -L. lib_mbedtls.so -l:lib_timing.so -l:lib_csignals.so
mbedtls.o: mbedtls.c
$(CC) -I$(PROJECT_ROOT_PATH)/ext/mbedtls/build/include/ $(CFLAGS) -c $<
@@ -166,8 +169,8 @@ ippcp: ippcp_provider.so
lib_ippcp.so:
cp $(PROJECT_ROOT_PATH)/ext/ipp-crypto/build/.build/RELEASE/lib/libippcp.so lib_ippcp.so
-ippcp_provider.so: ippcp.o c_utils.o | lib_timing.so lib_signals.so lib_ippcp.so
- $(CC) $(LFLAGS) -o $@ -Wl,-rpath,'$$ORIGIN/lib' $^ -L. lib_ippcp.so -l:lib_timing.so -l:lib_signals.so
+ippcp_provider.so: ippcp.o c_utils.o | lib_timing.so lib_csignals.so lib_ippcp.so
+ $(CC) $(LFLAGS) -o $@ -Wl,-rpath,'$$ORIGIN/lib' $^ -L. lib_ippcp.so -l:lib_timing.so -l:lib_csignals.so
ippcp.o: ippcp.c
$(CC) -I$(PROJECT_ROOT_PATH)/ext/ipp-crypto/build/.build/RELEASE/include/ $(CFLAGS) -c $<
@@ -176,8 +179,8 @@ ippcp.o: ippcp.c
# Nettle shim
nettle: nettle_provider.so
-nettle_provider.so: nettle.o c_utils.o | lib_timing.so lib_signals.so
- $(CC) $(LFLAGS) -o $@ -Wl,-rpath,'$$ORIGIN/lib' $^ -L. $(shell pkg-config --libs nettle) -l:lib_timing.so -l:lib_signals.so $(shell pkg-config --libs hogweed) -lgmp
+nettle_provider.so: nettle.o c_utils.o | lib_timing.so lib_csignals.so
+ $(CC) $(LFLAGS) -o $@ -Wl,-rpath,'$$ORIGIN/lib' $^ -L. $(shell pkg-config --libs nettle) -l:lib_timing.so -l:lib_csignals.so $(shell pkg-config --libs hogweed) -lgmp
nettle.o: nettle.c
$(CC) $(shell pkg-config --cflags nettle) $(shell pkg-config --libs hogweed) -lgmp $(CFLAGS) -c $<
@@ -189,8 +192,8 @@ libressl: libressl_provider.so
lib_libressl.so:
cp $(PROJECT_ROOT_PATH)/ext/libressl/build/crypto/libcrypto.so lib_libressl.so
-libressl_provider.so: libressl.o c_utils.o | lib_timing.so lib_signals.so lib_libressl.so
- $(CC) $(LFLAGS) -o $@ -Wl,-rpath,'$$ORIGIN/lib' $^ -L. lib_libressl.so -l:lib_timing.so -l:lib_signals.so
+libressl_provider.so: libressl.o c_utils.o | lib_timing.so lib_csignals.so lib_libressl.so
+ $(CC) $(LFLAGS) -o $@ -Wl,-rpath,'$$ORIGIN/lib' $^ -L. lib_libressl.so -l:lib_timing.so -l:lib_csignals.so
libressl.o: libressl.c
$(CC) -I$(PROJECT_ROOT_PATH)/ext/libressl/build/include/ $(CFLAGS) -c $<
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 466628a..3f3c473 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
@@ -4,11 +4,6 @@
#include <setjmp.h>
#include <signal.h>
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
#define TIMEOUT 5
/**
@@ -41,39 +36,18 @@ jobject get_siginfo(JNIEnv *env);
if (!sigsetjmp(*get_jmpbuf(), 1))
#define SIG_CATCH() deinit_signals();
#define SIG_DEINIT() deinit_signals();
-#ifdef __cplusplus
-#define SIG_HANDLE(env) do { \
- jobject siginfo = get_siginfo(env); \
- if (siginfo != NULL) { \
- jclass sigexception_class = env->FindClass("cz/crcs/ectester/standalone/libs/jni/SignalException"); \
- jmethodID new_sigexception = env->GetMethodID(sigexception_class, "<init>", "(Lcz/crcs/ectester/standalone/libs/jni/SigInfo;)V"); \
- jobject sigexception = env->NewObject(sigexception_class, new_sigexception, siginfo); \
- env->Throw((jthrowable) sigexception); \
- } \
- if (get_timedout()) { \
- jclass timeoutexception_class = env->FindClass("cz/crcs/ectester/standalone/libs/jni/TimeoutException"); \
- env->ThrowNew(timeoutexception_class, "Operation timed out."); \
- } \
-} while (0)
-#else
#define SIG_HANDLE(env) do { \
- jobject siginfo = get_siginfo(env); \
- if (siginfo != NULL) { \
- jclass sigexception_class = (*env)->FindClass(env, "cz/crcs/ectester/standalone/libs/jni/SignalException"); \
- jmethodID new_sigexception = (*env)->GetMethodID(env, sigexception_class, "<init>", "(Lcz/crcs/ectester/standalone/libs/jni/SigInfo;)V"); \
- jobject sigexception = (*env)->NewObject(env, sigexception_class, new_sigexception, siginfo); \
- (*env)->Throw(env, sigexception); \
- } \
- if (get_timedout()) { \
- jclass timeoutexception_class = (*env)->FindClass(env, "cz/crcs/ectester/standalone/libs/jni/TimeoutException"); \
- (*env)->ThrowNew(env, timeoutexception_class, "Operation timed out."); \
- } \
-} while (0)
-#endif
+ jobject siginfo = get_siginfo(env); \
+ if (siginfo != NULL) { \
+ jclass sigexception_class = (*env)->FindClass(env, "cz/crcs/ectester/standalone/libs/jni/SignalException"); \
+ jmethodID new_sigexception = (*env)->GetMethodID(env, sigexception_class, "<init>", "(Lcz/crcs/ectester/standalone/libs/jni/SigInfo;)V"); \
+ jobject sigexception = (*env)->NewObject(env, sigexception_class, new_sigexception, siginfo); \
+ (*env)->Throw(env, sigexception); \
+ } \
+ if (get_timedout()) { \
+ jclass timeoutexception_class = (*env)->FindClass(env, "cz/crcs/ectester/standalone/libs/jni/TimeoutException"); \
+ (*env)->ThrowNew(env, timeoutexception_class, "Operation timed out."); \
+ } \
+ } while (0)
#define SIG_CATCH_HANDLE(env) SIG_CATCH(); \
SIG_HANDLE(env)
-
-
-#ifdef __cplusplus
-}
-#endif
diff --git a/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/cpp_signals.cpp b/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/cpp_signals.cpp
new file mode 100644
index 0000000..75bc17c
--- /dev/null
+++ b/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/cpp_signals.cpp
@@ -0,0 +1,122 @@
+#include "cpp_utils.hpp"
+#include "cpp_signals.hpp"
+
+#if __linux || __posix
+
+#include <signal.h>
+#include <setjmp.h>
+#include <stdbool.h>
+#include <pthread.h>
+#include <unistd.h>
+
+static siginfo_t last_siginfo;
+static bool initialized = false;
+static bool caught = false;
+static bool timedout = false;
+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;
+
+extern "C"
+{
+
+void handler(int signo, siginfo_t *info, void *context) {
+ //printf("Signal, %i\n", signo);
+ last_siginfo = *info;
+ caught = true;
+ siglongjmp(*target, 1);
+}
+
+void alarm_handler(int signo) {
+ //printf("Alarm\n");
+ timedout = true;
+ siglongjmp(*target, 1);
+}
+
+
+sigjmp_buf *get_jmpbuf() {
+ return &buf;
+}
+
+static struct sigaction old_segv;
+static struct sigaction old_abrt;
+static struct sigaction old_alrm;
+
+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);
+ action.sa_flags = SA_SIGINFO;
+
+ sigaction(SIGSEGV, &action, &old_segv);
+ sigaction(SIGABRT, &action, &old_abrt);
+
+ struct sigaction alarm_action;
+ alarm_action.sa_handler = alarm_handler;
+ sigemptyset(&alarm_action.sa_mask);
+ alarm_action.sa_flags = 0;
+ sigaction(SIGALRM, &alarm_action, &old_alrm);
+
+ target = 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, &old_segv, NULL);
+ sigaction(SIGABRT, &old_abrt, NULL);
+ sigaction(SIGALRM, &old_alrm, NULL);
+
+ target = NULL;
+ initialized = false;
+}
+
+bool get_timedout() {
+ return timedout;
+}
+
+jobject get_siginfo(JNIEnv *env) {
+ if (!caught) {
+ return NULL;
+ }
+
+ jclass local_siginfo_class = env->FindClass("cz/crcs/ectester/standalone/libs/jni/SigInfo");
+ jmethodID siginfo_init = env->GetMethodID(local_siginfo_class, "<init>", "(IIIIIJIJJ)V");
+ return env->NewObject(local_siginfo_class, siginfo_init,
+ (jint) last_siginfo.si_signo,
+ (jint) last_siginfo.si_code,
+ (jint) last_siginfo.si_errno,
+ (jint) last_siginfo.si_pid,
+ (jint) last_siginfo.si_uid,
+ (jlong) last_siginfo.si_addr,
+ (jint) last_siginfo.si_status,
+ (jlong) last_siginfo.si_band,
+ (jlong) 0);
+}
+
+}
+
+#endif \ No newline at end of file
diff --git a/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/cpp_signals.hpp b/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/cpp_signals.hpp
new file mode 100644
index 0000000..b926656
--- /dev/null
+++ b/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/cpp_signals.hpp
@@ -0,0 +1,59 @@
+#pragma once
+
+#include <jni.h>
+#include <setjmp.h>
+#include <signal.h>
+
+#define TIMEOUT 5
+
+extern "C"
+{
+
+/**
+ *
+ */
+void init_signals(jmp_buf *env, unsigned int timeout);
+
+/**
+ *
+ */
+sigjmp_buf *get_jmpbuf();
+
+/**
+ *
+ */
+void deinit_signals();
+
+/**
+ *
+ */
+bool get_timedout();
+
+/**
+ *
+ */
+jobject get_siginfo(JNIEnv *env);
+
+
+#define SIG_TRY(timeout) init_signals(get_jmpbuf(), timeout); \
+ if (!sigsetjmp(*get_jmpbuf(), 1))
+#define SIG_CATCH() deinit_signals();
+#define SIG_DEINIT() deinit_signals();
+#define SIG_HANDLE(env) do { \
+ jobject siginfo = get_siginfo(env); \
+ if (siginfo != NULL) { \
+ jclass sigexception_class = env->FindClass("cz/crcs/ectester/standalone/libs/jni/SignalException"); \
+ jmethodID new_sigexception = env->GetMethodID(sigexception_class, "<init>", "(Lcz/crcs/ectester/standalone/libs/jni/SigInfo;)V"); \
+ jobject sigexception = env->NewObject(sigexception_class, new_sigexception, siginfo); \
+ env->Throw((jthrowable) sigexception); \
+ } \
+ if (get_timedout()) { \
+ jclass timeoutexception_class = env->FindClass("cz/crcs/ectester/standalone/libs/jni/TimeoutException"); \
+ env->ThrowNew(timeoutexception_class, "Operation timed out."); \
+ } \
+ } while (0)
+#define SIG_CATCH_HANDLE(env) SIG_CATCH(); \
+ SIG_HANDLE(env)
+
+
+} \ No newline at end of file
diff --git a/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/cryptopp.cpp b/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/cryptopp.cpp
index 3590ef2..c4c74a6 100644
--- a/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/cryptopp.cpp
+++ b/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/cryptopp.cpp
@@ -71,7 +71,12 @@ using CryptoPP::Integer;
#include "cpp_utils.hpp"
#include "c_timing.h"
-#include "c_signals.h"
+#include "cpp_signals.hpp"
+#undef SIG_TRY
+#undef SIG_CATCH_HANDLE
+#undef SIG_CATCH
+#undef SIG_HANDLE
+#undef SIG_DEINIT
#define SIG_TRY(x)
#define SIG_CATCH_HANDLE(x)
#define SIG_CATCH()