00001
00010 #include "sigsafe_internal.h"
00011 #include <ucontext.h>
00012 #include <unistd.h>
00013
00014 void sigsafe_handler_for_platform_(ucontext_t *ctx) {
00015 struct sigsafe_syscall_ *s;
00016 void *ip;
00017 ip = (void*) ctx->uc_mcontext.sc_ip;
00018 for (s = sigsafe_syscalls_; s->minjmp != NULL; s++) {
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029 void *minjmp = * (void**) s->minjmp;
00030 void *maxjmp = * (void**) s->maxjmp + 1;
00031 void *jmpto = * (void**) s->jmpto;
00032 if (minjmp <= ip && ip <= maxjmp) {
00033 #ifdef SIGSAFE_DEBUG_JUMP
00034 write(2, "[J]", 3);
00035 #endif
00036 ctx->uc_mcontext.sc_ip = (unsigned long) jmpto;
00037 return;
00038 }
00039 }
00040 }