aboutsummaryrefslogtreecommitdiff
path: root/usr.bin/bsdiff/bspatch/bspatch.c
diff options
context:
space:
mode:
authorRicardo Branco <rbranco@suse.de>2024-04-19 22:32:43 +0000
committerWarner Losh <imp@FreeBSD.org>2024-04-19 22:33:07 +0000
commit725a9f47324d42037db93c27ceb40d4956872f3e (patch)
treed156469ad9b19fe115f80b503d7ef2c792ef52ec /usr.bin/bsdiff/bspatch/bspatch.c
parentde525c502a3aab50de42df39f4b0c2840f4c09a6 (diff)
Diffstat (limited to 'usr.bin/bsdiff/bspatch/bspatch.c')
-rw-r--r--usr.bin/bsdiff/bspatch/bspatch.c16
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);
}