- buf->len = ALIGN(max_len + PAGE_SIZE, PAGE_SIZE);
- buf->ptr = mmap(NULL, buf->len, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0);
- if (buf->ptr == MAP_FAILED)
- die("mmap(%s): %m", zero);
+ buf->len = ALIGN(max_len + 3, PAGE_SIZE); // +3 due to the unaligned access
+ buf->start = mmap(NULL, buf->len + PAGE_SIZE, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
+ if (buf->start == MAP_FAILED)
+ die("mmap(anonymous): %m");
+ if (mprotect(buf->start + buf->len, PAGE_SIZE, PROT_NONE) < 0)
+ die("mprotect: %m");
+ buf->old_sigsegv_handler = xmalloc(sizeof(struct sigaction));
+ handle_signal(SIGSEGV, buf->old_sigsegv_handler);