*/
#include "lib/lib.h"
+#include "lib/threads.h"
#include "lib/lizard.h"
-#include <stdlib.h>
#include <sys/mman.h>
-#include <sys/user.h>
#include <fcntl.h>
#include <signal.h>
#include <setjmp.h>
struct lizard_buffer {
uns len;
void *ptr;
- struct sigaction old_sigsegv_handler;
};
struct lizard_buffer *
struct lizard_buffer *buf = xmalloc(sizeof(struct lizard_buffer));
buf->len = 0;
buf->ptr = NULL;
- handle_signal(SIGSEGV, &buf->old_sigsegv_handler);
+ handle_signal(SIGSEGV);
return buf;
}
void
lizard_free(struct lizard_buffer *buf)
{
+ unhandle_signal(SIGSEGV);
if (buf->ptr)
- munmap(buf->ptr, buf->len + PAGE_SIZE);
- unhandle_signal(SIGSEGV, &buf->old_sigsegv_handler);
+ munmap(buf->ptr, buf->len + CPU_PAGE_SIZE);
xfree(buf);
}
static void
lizard_realloc(struct lizard_buffer *buf, uns max_len)
- /* max_len needs to be aligned to PAGE_SIZE */
+ /* max_len needs to be aligned to CPU_PAGE_SIZE */
{
if (max_len <= buf->len)
return;
max_len = 2*buf->len;
if (buf->ptr)
- munmap(buf->ptr, buf->len + PAGE_SIZE);
+ munmap(buf->ptr, buf->len + CPU_PAGE_SIZE);
buf->len = max_len;
- buf->ptr = mmap(NULL, buf->len + PAGE_SIZE, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
+ buf->ptr = mmap(NULL, buf->len + CPU_PAGE_SIZE, PROT_READ | PROT_WRITE, MAP_ANON | MAP_PRIVATE, -1, 0);
if (buf->ptr == MAP_FAILED)
- die("mmap(anonymous): %m");
- if (mprotect(buf->ptr + buf->len, PAGE_SIZE, PROT_NONE) < 0)
+ die("mmap(anonymous, %d bytes): %m", (uns)(buf->len + CPU_PAGE_SIZE));
+ if (mprotect(buf->ptr + buf->len, CPU_PAGE_SIZE, PROT_NONE) < 0)
die("mprotect: %m");
}
static int
sigsegv_handler(int signal UNUSED)
{
- log(L_ERROR, "SIGSEGV caught in lizard_decompress()");
longjmp(safe_decompress_jump, 1);
return 1;
}
* case of buffer-overflow. The function is not re-entrant because of a
* static longjmp handler. */
{
- uns lock_offset = ALIGN(expected_length + 3, PAGE_SIZE); // +3 due to the unaligned access
+ uns lock_offset = ALIGN_TO(expected_length + 3, CPU_PAGE_SIZE); // +3 due to the unaligned access
if (lock_offset > buf->len)
lizard_realloc(buf, lock_offset);
- volatile sh_sighandler_t old_handler = signal_handler[SIGSEGV];
- signal_handler[SIGSEGV] = sigsegv_handler;
+ volatile sh_sighandler_t old_handler = set_signal_handler(SIGSEGV, sigsegv_handler);
byte *ptr;
if (!setjmp(safe_decompress_jump))
{
}
else
{
+ log(L_ERROR, "SIGSEGV caught in lizard_decompress()");
ptr = NULL;
errno = EFAULT;
}
- signal_handler[SIGSEGV] = old_handler;
+ set_signal_handler(SIGSEGV, old_handler);
return ptr;
}