#include #include #include #include #include int main() { void *addr = mmap(NULL, 65536, PROT_NONE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); printf("mapped at %p\n", addr); void *addr2 = mmap(addr, 65536, PROT_NONE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED | MAP_EXCL, -1, 0); if (addr2 == MAP_FAILED) { if (errno == ENOMEM) { printf("Successfully detected clash with ENOMEM\n"); } else { perror("Unexpected error from mmap"); } } else if (addr2 == addr) { printf("Error: unexpected overlapping mmap\n"); } else { printf("Error: unexpected disjoint mmap\n"); } addr = (void *)(~65535 & (uintptr_t)&main); printf("main at %p\n", addr); addr2 = mmap(addr, 65536, PROT_NONE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED | MAP_EXCL, -1, 0); if (addr2 == MAP_FAILED) { if (errno == ENOMEM) { printf("Successfully detected clash with ENOMEM\n"); } else { perror("Unexpected error from mmap"); } } else if (addr2 == addr) { printf("Error: unexpected overlapping mmap\n"); } else { printf("Error: unexpected disjoint mmap\n"); } addr = (void *)(~65535 & (uintptr_t)dlsym(RTLD_DEFAULT, "printf")); printf("printf at %p\n", addr); addr2 = mmap(addr, 65536, PROT_NONE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED | MAP_EXCL, -1, 0); if (addr2 == MAP_FAILED) { if (errno == ENOMEM) { printf("Successfully detected clash with ENOMEM\n"); } else { perror("Unexpected error from mmap"); } } else if (addr2 == addr) { printf("Error: unexpected overlapping mmap\n"); } else { printf("Error: unexpected disjoint mmap\n"); } return 0; }