1 /* 2 * Verifies that the "vm.mmap_noexec_taint" sysctl is operational. 3 */ 4 #include <errno.h> 5 #include <fcntl.h> 6 #include <stdio.h> 7 #include <stdlib.h> 8 #include <sys/mman.h> 9 #include <sys/types.h> 10 #include <sys/stat.h> 11 12 void err_sys(char *msg) 13 { 14 perror(msg); 15 exit(1); 16 } 17 18 void err_quit(char *msg) 19 { 20 fprintf(stderr, "FAIL: %s\n", msg); 21 exit(1); 22 } 23 24 int main(int argc, char *argv[]) 25 { 26 int fd; 27 int *arearw, *areaex; 28 29 if (argc < 2) 30 err_quit("need to pass a filename"); 31 32 if ((fd = open(argv[1], O_RDWR|O_CREAT|O_EXCL, S_IRWXU)) < 0) 33 err_sys("open error"); 34 lseek(fd, 100, SEEK_CUR); 35 write(fd, "A", 1); 36 if ((arearw = (int *)mmap(0, sizeof(int), 37 PROT_READ | PROT_WRITE, MAP_SHARED, 38 fd, 0)) == MAP_FAILED) 39 err_sys("arearw mmap error"); 40 41 /* Make sure mmap with PROT_EXEC fails. */ 42 if ((areaex = (int *)mmap(0, sizeof(int), 43 PROT_READ | PROT_EXEC, MAP_SHARED, 44 fd, 0)) != MAP_FAILED) 45 err_quit("areaex mmap allowed PROT_EXEC"); 46 47 if ((areaex = (int *)mmap(0, sizeof(int), 48 PROT_READ, MAP_SHARED, 49 fd, 0)) == MAP_FAILED) 50 err_sys("areaex mmap error"); 51 if (mprotect(areaex, sizeof(int), PROT_READ | PROT_EXEC)) 52 err_sys("areaex mprotect error"); 53 close(fd); 54 55 /* Make sure we start zero-filled. */ 56 if (*arearw != 0x0) 57 err_quit("not zero-filled"); 58 59 /* Make sure we're sharing a memory area. */ 60 *arearw = 0xfabecafe; 61 if (*arearw != *areaex) 62 err_quit("memory regions are not shared"); 63 64 printf("pass\n"); 65 return 0; 66 } 67