/* Demonstrate how mmapping a file shared can make your program segfault * if someone truncates it while you’re accessing it */ #include #include #include #include #include #include #include #include enum { size = 8192 }; int main() { char *n = "tmp.mmapcrash"; int f = open(n, O_RDWR | O_CREAT, 0666); if (f < 0) err(errno, "open: %s", n); for (size_t i = 0; i < size; i++) { if (write(f, "x", 1) < 0) err(errno, "write"); } close(f); int g = open(n, O_RDONLY); if (g < 0) err(errno, "open: %s", n); int h = open(n, O_RDWR); if (h < 0) err(errno, "open: %s", n); unsigned char *m = mmap(NULL, size, PROT_READ, MAP_SHARED, g, 0); if (!m) err(errno, "mmap"); size_t checksum = 0; for (size_t i = 0; i < size; i++) checksum += m[i]; printf("checksum is %lu\n", (unsigned long)checksum); if (ftruncate(h, size - 4096) < 0) err(errno, "ftruncate"); checksum = 0; for (size_t i = 0; i < size; i++) { printf("[%d] ", (int)i); fflush(stdout); checksum += m[i]; } printf("This is a triumph! It's still %lu\n", (unsigned long)checksum); return 0; }