1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
| #include "utils.h" #define BUFFER_SIZE 2048 void handler(int sig) { logger(LOG_INFO, "received: signal(%d):%s", sig, strsignal(sig)); CHECK_LOG(signal(sig, SIG_DFL) != SIG_ERR); fflush(NULL); raise(sig); return; } int offalign(int off, int size) { return (off%size > 0 ? (size - off%size) : 0); }
long pagesize; void testcase(const char *file, int filesize, int mmapsize, int access) { pid_t pid; CHECK_RET((pid = fork()) != -1, return;); if(!pid) { CHECK_EXIT(signal(SIGBUS, handler) != SIG_ERR); CHECK_EXIT(signal(SIGSEGV, handler) != SIG_ERR); logger(LOG_INFO, "filesize=%d, mmapsize=%d, access=%d", filesize, mmapsize, access); int fd = open(file, O_RDWR | O_CREAT | O_SYNC, 0666); CHECK_EXIT(ftruncate(fd, filesize) != -1); CHECK_EXIT(fsync(fd) != -1); CHECK_EXIT(fd != -1); char *mmapP = mmap(NULL, mmapsize+pagesize, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); if(offalign(mmapsize,pagesize) > 0) CHECK_LOG(munmap(mmapP+offalign(mmapsize,pagesize) + mmapsize, pagesize) != -1); CHECK_EXIT(mmapP != MAP_FAILED); CHECK_EXIT(close(fd) != -1); logger(LOG_INFO, "mmapP=%p, access:%p", mmapP, (mmapP + access)); mmapP[access] = 'b'; CHECK_LOG(munmap(mmapP, mmapsize) != -1); exit(0); } int status; CHECK_RET(waitpid(pid, &status, 0) != -1, return;); logger(LOG_INFO, "exit status=%d, exit sig=(%d)%s", WEXITSTATUS(status), WSTOPSIG(status), strsignal(WSTOPSIG(status))); } int main(int argc, char *argv[]) { setbuf(stderr, NULL); setbuf(stdout, NULL); pagesize = sysconf(_SC_PAGESIZE); if(argc == 2) { logger(LOG_INFO, "pagesize = %ld", pagesize); testcase(argv[1], pagesize*3, pagesize / 2+pagesize, 0); testcase(argv[1], pagesize*3, pagesize / 2+pagesize, pagesize / 2+pagesize); testcase(argv[1], pagesize*3, pagesize / 2+pagesize, pagesize*2);
testcase(argv[1], pagesize/2, pagesize*2, 0); testcase(argv[1], pagesize/2, pagesize*2, pagesize / 2); testcase(argv[1], pagesize/2, pagesize*2, pagesize); testcase(argv[1], pagesize/2, pagesize*2, pagesize*2); testcase(argv[1], pagesize/2, pagesize, pagesize);
} else { CHECK_EXIT_MSG(argc == 5, "Usage: %s filename filesize mmapsize access", argv[0]); int filesize, mmapsize, access; CHECK_EXIT_MSG(safe_atoi(argv[2], &filesize) != -1, "safe_atoi filesize=%s", argv[2]); CHECK_EXIT_MSG(safe_atoi(argv[3], &mmapsize) != -1, "safe_atoi mmapsize=%s", argv[3]); CHECK_EXIT_MSG(safe_atoi(argv[4], &access) != -1, "safe_atoi access=%s", argv[4]); testcase(argv[1], filesize, mmapsize, access); } }
|