#include <sys/mman.h>
#include <err.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
#include "pivot.h"
void handler(int);
void dotrap(void);
static volatile char *trapmap;
int
main(int argc, char *argv[])
{
stack_t ss;
struct sigaction act;
void (**newstack)(void);
long pagesize;
ss.ss_sp = malloc(SIGSTKSZ);
if (ss.ss_sp == NULL)
err(1, "malloc sigstack");
ss.ss_size = SIGSTKSZ;
ss.ss_flags = 0;
if (sigaltstack(&ss, NULL) == -1)
err(1, "sigaltstack");
act.sa_handler = handler;
sigemptyset(&act.sa_mask);
act.sa_flags = SA_ONSTACK;
pagesize = sysconf(_SC_PAGESIZE);
if (pagesize == -1)
err(1, "sysconf");
newstack = malloc(pagesize > SIGSTKSZ ? pagesize : SIGSTKSZ);
if (newstack == NULL)
err(1, "malloc newstack");
newstack[pagesize/sizeof(*newstack)/2] = dotrap;
trapmap = mmap(NULL, pagesize, PROT_READ | PROT_WRITE, MAP_ANONYMOUS,
-1, 0);
if (trapmap == MAP_FAILED)
err(1, "mmap");
if (sigaction(SIGSEGV, &act, NULL) == -1)
err(1, "sigaction");
pivot(&newstack[pagesize/sizeof(*newstack)/2]);
return 3;
}
void
handler(int signum)
{
_exit(0);
}
void
dotrap(void)
{
trapmap[0] = 'x';
exit(2);
}