#include <signal.h>
#include <setjmp.h>
#include <stddef.h>
#include <memory.h>
__thread sigjmp_buf jbuf;
static void bulletproof_handler(int sig __attribute__((unused)),
siginfo_t *si __attribute__((unused)),
void *unused __attribute__((unused))) {
siglongjmp(jbuf, 1);
}
size_t bulletproof_register() {
struct sigaction new_handler;
new_handler.sa_flags = SA_SIGINFO;
sigemptyset(&new_handler.sa_mask);
new_handler.sa_sigaction = bulletproof_handler;
return sigaction(SIGSEGV, &new_handler, NULL);
}
size_t bulletproof_load(const size_t *loc, size_t *dst) {
if (sigsetjmp(jbuf, -1) != 0) {
return 1;
}
*dst = *loc;
return 0;
}
size_t bulletproof_store(size_t *loc, size_t val) {
if (sigsetjmp(jbuf, -1) != 0) {
return 1;
}
*loc = val;
return 0;
}
size_t bulletproof_load_bytes(const char *loc, char *dst, size_t size) {
if (sigsetjmp(jbuf, -1) != 0) {
return 1;
}
memcpy((void *) dst, (void *) loc, size);
return 0;
}
size_t bulletproof_store_bytes(char *loc, const char *src, size_t size) {
if (sigsetjmp(jbuf, -1) != 0) {
return 1;
}
memcpy((void *) loc, (void *) src, size);
return 0;
}