/*
* Verifies that the "vm.mmap_noexec_taint" sysctl is operational.
*/
#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <sys/stat.h>
void err_sys(char *msg)
{
perror(msg);
exit(1);
}
void err_quit(char *msg)
{
fprintf(stderr, "FAIL: %s\n", msg);
exit(1);
}
int main(int argc, char *argv[])
{
int fd;
int *arearw, *areaex;
if (argc < 2)
err_quit("need to pass a filename");
if ((fd = open(argv[1], O_RDWR|O_CREAT|O_EXCL, S_IRWXU)) < 0)
err_sys("open error");
lseek(fd, 100, SEEK_CUR);
write(fd, "A", 1);
if ((arearw = (int *)mmap(0, sizeof(int),
PROT_READ | PROT_WRITE, MAP_SHARED,
fd, 0)) == MAP_FAILED)
err_sys("arearw mmap error");
/* Make sure mmap with PROT_EXEC fails. */
if ((areaex = (int *)mmap(0, sizeof(int),
PROT_READ | PROT_EXEC, MAP_SHARED,
fd, 0)) != MAP_FAILED)
err_quit("areaex mmap allowed PROT_EXEC");
if ((areaex = (int *)mmap(0, sizeof(int),
PROT_READ, MAP_SHARED,
fd, 0)) == MAP_FAILED)
err_sys("areaex mmap error");
if (mprotect(areaex, sizeof(int), PROT_READ | PROT_EXEC))
err_sys("areaex mprotect error");
close(fd);
/* Make sure we start zero-filled. */
if (*arearw != 0x0)
err_quit("not zero-filled");
/* Make sure we're sharing a memory area. */
*arearw = 0xfabecafe;
if (*arearw != *areaex)
err_quit("memory regions are not shared");
printf("pass\n");
return 0;
}