#define _GNU_SOURCE #include #include #include #include #include #ifndef AT_FDCWD #define AT_FDCWD -100 #endif #if defined(__i386__) #define __NR_revokeat 324 #else #error unsupported arch #endif int revokeat(int dfd, const char *path) { return syscall(__NR_revokeat, dfd, path); } static void panic(const char *s) { perror(s); exit(1); } static void write_to(unsigned char *b, unsigned long size) { unsigned long i; for (i = 0; i < size; i++) b[1] = 0x6a; } int main(int argc, char *argv[]) { int fd, err; void *p, *q, *s; fd = open(argv[1], O_RDWR); if (fd < 0) panic("open"); s = mmap(NULL, getpagesize(), PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); if (s == MAP_FAILED) panic("mmap"); p = mmap(NULL, getpagesize(), PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0); if (p == MAP_FAILED) panic("mmap"); err = revokeat(AT_FDCWD, argv[1]); if (err) panic("revokeat"); fd = open(argv[1], O_RDWR); if (fd < 0) panic("open"); q = mmap(s, getpagesize(), PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); if (q != MAP_FAILED && q == s) { printf("Failed: overwritten mapped region.\n"); exit(1); } write_to(p, getpagesize()); printf("Test OK.\n"); return 0; }