diff --git a/usr.bin/diff/diffreg.c b/usr.bin/diff/diffreg.c index 4c921151045..4c17bef4c3e 100644 --- a/usr.bin/diff/diffreg.c +++ b/usr.bin/diff/diffreg.c @@ -71,6 +71,7 @@ __FBSDID("$FreeBSD$"); #include #include +#include #include #include @@ -341,7 +342,7 @@ diffreg(char *file1, char *file2, int flags, int capsicum) pr = start_pr(file1, file2); if (capsicum) { - cap_rights_init(&rights_ro, CAP_READ, CAP_FSTAT, CAP_SEEK); + cap_rights_init(&rights_ro, CAP_READ, CAP_FSTAT, CAP_SEEK, CAP_MMAP); if (caph_rights_limit(fileno(f1), &rights_ro) < 0) err(2, "unable to limit rights on: %s", file1); if (caph_rights_limit(fileno(f2), &rights_ro) < 0) @@ -360,6 +361,15 @@ diffreg(char *file1, char *file2, int flags, int capsicum) if (caph_enter() < 0) err(2, "unable to enter capability mode"); } + char *buf1 = mmap(NULL, stb1.st_size, PROT_READ, MAP_SHARED, fileno(f1), 0); + if (buf1 == NULL) + err(2, "unable to mmap"); + msync(buf1, stb1.st_size, MS_INVALIDATE); + char *buf2 = mmap(NULL, stb2.st_size, PROT_READ, MAP_SHARED, fileno(f2), 0); + if (buf2 == NULL) + err(2, "unable to mmap"); + msync(buf2, stb2.st_size, MS_INVALIDATE); + switch (files_differ(f1, f2, flags)) { case 0: