All pastes #937715 Raw Edit

Untitled

public c v1 · immutable
·published 2008-03-11 04:05 UTC
rendered paste body
#include <sys/mman.h>#include <signal.h>#include <stdio.h>#define MKCASE(x) case x:       \                        return #x; \                  break;char *sigcodelist(int scl) {        static char def_str[30];        switch(scl) {                MKCASE(SI_USER);                MKCASE(SI_KERNEL);                MKCASE(SI_QUEUE);                MKCASE(SI_TKILL);                default:                snprintf(def_str, 30, "%d", scl);                return(def_str);        }        return(NULL);}void sigsegv_handler(int sig, siginfo_t *sit, void *ptr) {        void *mmapptr;        unsigned int pagebitmask, pagesize;        pagesize = getpagesize();        pagebitmask = ~ (pagesize - 1);        printf("pagebitmask = %p\n", pagebitmask);        printf("->si_code = %s\n", sigcodelist(sit->si_code));        printf("ptr -> %p\n", ptr);        if (sit->si_signo == SIGSEGV) {                printf("Sigsegv at :%p\n", sit->si_addr);                mmapptr = (void *)((unsigned int)sit->si_addr & pagebitmask);                printf("mmap(%p) at = %d\n", mmapptr,                        mmap(mmapptr, pagesize, PROT_READ|PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE | MAP_FIXED, -1, 0)                );                memset(mmapptr, -1, pagesize);        }}void installsh() {        struct sigaction n;        memset(&n, 0, sizeof n);        n.sa_sigaction = sigsegv_handler;        n.sa_flags = SA_SIGINFO;        printf("sigaction = %d\n", sigaction(SIGSEGV, &n, NULL));}int main() {        installsh();        char *a = 0x123;        printf("%p = %d\n", a, *a);        return(0);}