X-Git-Url: http://mj.ucw.cz/gitweb/?a=blobdiff_plain;ds=inline;f=lib%2Flizard-safe.c;h=1c46cbdcbb58d211cd27cfb5a316a8917f1d64ae;hb=e89d1302e7a67e3c46753ec0dd93d13f2d2080de;hp=6d0b10c952b585e0cd93cf9bd24583f53fd9fb67;hpb=4deb7fd75ea1306e943ab414efca26b1951cfd23;p=libucw.git diff --git a/lib/lizard-safe.c b/lib/lizard-safe.c index 6d0b10c9..1c46cbdc 100644 --- a/lib/lizard-safe.c +++ b/lib/lizard-safe.c @@ -28,7 +28,8 @@ lizard_alloc(uns max_len) die("mmap(anonymous): %m"); if (mprotect(buf->start + buf->len, PAGE_SIZE, PROT_NONE) < 0) die("mprotect: %m"); - buf->old_sigsegv_handler = handle_signal(SIGSEGV); + buf->old_sigsegv_handler = xmalloc(sizeof(struct sigaction)); + handle_signal(SIGSEGV, buf->old_sigsegv_handler); return buf; } @@ -36,16 +37,18 @@ void lizard_free(struct lizard_buffer *buf) { munmap(buf->start, buf->len + PAGE_SIZE); - signal(SIGSEGV, buf->old_sigsegv_handler); + unhandle_signal(SIGSEGV, buf->old_sigsegv_handler); + xfree(buf->old_sigsegv_handler); xfree(buf); } static jmp_buf safe_decompress_jump; -static void -sigsegv_handler(void) +static int +sigsegv_handler(int signal UNUSED) { log(L_ERROR, "SIGSEGV caught in lizard_decompress()"); longjmp(safe_decompress_jump, 1); + return 1; } int @@ -61,22 +64,20 @@ lizard_decompress_safe(byte *in, struct lizard_buffer *buf, uns expected_length) errno = EFBIG; return -1; } - volatile my_sighandler_t old_handler = signal_handler[SIGSEGV]; + volatile sh_sighandler_t old_handler = signal_handler[SIGSEGV]; signal_handler[SIGSEGV] = sigsegv_handler; - int len, err; + int len; if (!setjmp(safe_decompress_jump)) { buf->ptr = buf->start + buf->len - lock_offset; len = lizard_decompress(in, buf->ptr); - err = errno; } else { buf->ptr = NULL; len = -1; - err = EFAULT; + errno = EFAULT; } signal_handler[SIGSEGV] = old_handler; - errno = err; return len; }