#include <stdio.h> #include <stdlib.h> #include <sys/mman.h> #include <fcntl.h> #include <unistd.h> #include <string.h> #include <sys/stat.h> #include <signal.h> #include <setjmp.h> char* buf; struct stat statbuf; void handler(int signo) { printf("permission denied\n"); if (mprotect(buf, statbuf.st_size, PROT_READ|PROT_WRITE) == -1) { perror("failed to alter permission"); exit(1); } printf("permission modified\n"); } int main() { int fd; if (signal(SIGSEGV, handler) == SIG_ERR) { printf("can not set handler for SIGSEGV.\n"); exit(0); } if (stat("test.txt", &statbuf) == -1) { perror("failed to get stat"); exit(1); } fd = open("test.txt", O_RDWR); if (fd == -1) { perror("failed to open file\n"); exit(1); } buf = (char*)mmap(NULL, statbuf.st_size, PROT_READ, MAP_SHARED, fd, 0); // readonly memory map printf("try to write to a readonly memccpy map\n"); memcpy(buf, "china\n", 6); if (munmap(buf, statbuf.st_size) == -1) { perror("failed to unmap\n"); exit(1); } close(fd); return 0; }