diff options
author | Ricardo Branco <rbranco@suse.de> | 2024-04-19 22:32:43 +0000 |
---|---|---|
committer | Warner Losh <imp@FreeBSD.org> | 2024-04-19 22:33:07 +0000 |
commit | 725a9f47324d42037db93c27ceb40d4956872f3e (patch) | |
tree | d156469ad9b19fe115f80b503d7ef2c792ef52ec /usr.bin/bsdiff/bspatch/bspatch.c | |
parent | de525c502a3aab50de42df39f4b0c2840f4c09a6 (diff) |
Diffstat (limited to 'usr.bin/bsdiff/bspatch/bspatch.c')
-rw-r--r-- | usr.bin/bsdiff/bspatch/bspatch.c | 16 |
1 files changed, 9 insertions, 7 deletions
diff --git a/usr.bin/bsdiff/bspatch/bspatch.c b/usr.bin/bsdiff/bspatch/bspatch.c index d7fabddabbfe..ea43d78b12a1 100644 --- a/usr.bin/bsdiff/bspatch/bspatch.c +++ b/usr.bin/bsdiff/bspatch/bspatch.c @@ -42,6 +42,7 @@ #include <stdlib.h> #include <string.h> #include <unistd.h> +#include <sys/mman.h> #ifndef O_BINARY #define O_BINARY 0 @@ -151,7 +152,7 @@ int main(int argc, char *argv[]) if (cap_enter() < 0) err(1, "failed to enter security sandbox"); - cap_rights_init(&rights_ro, CAP_READ, CAP_FSTAT, CAP_SEEK); + cap_rights_init(&rights_ro, CAP_READ, CAP_FSTAT, CAP_SEEK, CAP_MMAP_R); cap_rights_init(&rights_wr, CAP_WRITE); cap_rights_init(&rights_dir, CAP_UNLINKAT); @@ -220,12 +221,13 @@ int main(int argc, char *argv[]) errx(1, "BZ2_bzReadOpen, bz2err = %d", ebz2err); if ((oldsize = lseek(oldfd, 0, SEEK_END)) == -1 || - oldsize > SSIZE_MAX || - (old = malloc(oldsize)) == NULL || - lseek(oldfd, 0, SEEK_SET) != 0 || - read(oldfd, old, oldsize) != oldsize || - close(oldfd) == -1) + oldsize > SSIZE_MAX) err(1, "%s", argv[1]); + + old = mmap(NULL, oldsize+1, PROT_READ, MAP_SHARED, oldfd, 0); + if (old == MAP_FAILED || close(oldfd) != 0) + err(1, "%s", argv[1]); + if ((new = malloc(newsize)) == NULL) err(1, NULL); @@ -294,7 +296,7 @@ int main(int argc, char *argv[]) newfile = NULL; free(new); - free(old); + munmap(old, oldsize+1); return (0); } |