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;
}
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
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;
}