Home | History | Annotate | Download | only in src
      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