diff options
author | Ed Maste <emaste@FreeBSD.org> | 2016-09-15 01:58:12 +0000 |
---|---|---|
committer | Ed Maste <emaste@FreeBSD.org> | 2016-09-15 01:58:12 +0000 |
commit | 6d9f0e4d7002c17c353a39ee440439eefc0f2f6a (patch) | |
tree | ede1dbf77f2370e9e710403e67ecf02edde0bef9 | |
parent | b1ca2de9e95ef9c6939790dda278e2c4c0a3895b (diff) |
Notes
-rw-r--r-- | usr.bin/bsdiff/bspatch/bspatch.c | 31 |
1 files changed, 16 insertions, 15 deletions
diff --git a/usr.bin/bsdiff/bspatch/bspatch.c b/usr.bin/bsdiff/bspatch/bspatch.c index dc921291b7751..185814639a208 100644 --- a/usr.bin/bsdiff/bspatch/bspatch.c +++ b/usr.bin/bsdiff/bspatch/bspatch.c @@ -44,6 +44,7 @@ __FBSDID("$FreeBSD$"); #include <fcntl.h> #include <libgen.h> #include <limits.h> +#include <stdint.h> #include <stdio.h> #include <stdlib.h> #include <string.h> @@ -52,6 +53,7 @@ __FBSDID("$FreeBSD$"); #ifndef O_BINARY #define O_BINARY 0 #endif +#define HEADER_SIZE 32 static char *newfile; static int dirfd = -1; @@ -101,12 +103,11 @@ int main(int argc, char *argv[]) int newfd, oldfd; off_t oldsize, newsize; off_t bzctrllen, bzdatalen; - u_char header[32], buf[8]; + u_char header[HEADER_SIZE], buf[8]; u_char *old, *new; off_t oldpos, newpos; off_t ctrl[3]; - off_t lenread; - off_t i; + off_t i, lenread, offset; #ifdef HAVE_CAPSICUM cap_rights_t rights_dir, rights_ro, rights_wr; #endif @@ -181,7 +182,7 @@ int main(int argc, char *argv[]) */ /* Read header */ - if (fread(header, 1, 32, f) < 32) { + if (fread(header, 1, HEADER_SIZE, f) < HEADER_SIZE) { if (feof(f)) errx(1, "Corrupt patch"); err(1, "fread(%s)", argv[3]); @@ -195,27 +196,27 @@ int main(int argc, char *argv[]) bzctrllen = offtin(header + 8); bzdatalen = offtin(header + 16); newsize = offtin(header + 24); - if (bzctrllen < 0 || bzctrllen > OFF_MAX - 32 || - bzdatalen < 0 || bzctrllen + 32 > OFF_MAX - bzdatalen || + if (bzctrllen < 0 || bzctrllen > OFF_MAX - HEADER_SIZE || + bzdatalen < 0 || bzctrllen + HEADER_SIZE > OFF_MAX - bzdatalen || newsize < 0 || newsize > SSIZE_MAX) errx(1, "Corrupt patch"); /* Close patch file and re-open it via libbzip2 at the right places */ if (fclose(f)) err(1, "fclose(%s)", argv[3]); - if (fseeko(cpf, 32, SEEK_SET)) - err(1, "fseeko(%s, %lld)", argv[3], - (long long)32); + offset = HEADER_SIZE; + if (fseeko(cpf, offset, SEEK_SET)) + err(1, "fseeko(%s, %jd)", argv[3], (intmax_t)offset); if ((cpfbz2 = BZ2_bzReadOpen(&cbz2err, cpf, 0, 0, NULL, 0)) == NULL) errx(1, "BZ2_bzReadOpen, bz2err = %d", cbz2err); - if (fseeko(dpf, 32 + bzctrllen, SEEK_SET)) - err(1, "fseeko(%s, %lld)", argv[3], - (long long)(32 + bzctrllen)); + offset += bzctrllen; + if (fseeko(dpf, offset, SEEK_SET)) + err(1, "fseeko(%s, %jd)", argv[3], (intmax_t)offset); if ((dpfbz2 = BZ2_bzReadOpen(&dbz2err, dpf, 0, 0, NULL, 0)) == NULL) errx(1, "BZ2_bzReadOpen, bz2err = %d", dbz2err); - if (fseeko(epf, 32 + bzctrllen + bzdatalen, SEEK_SET)) - err(1, "fseeko(%s, %lld)", argv[3], - (long long)(32 + bzctrllen + bzdatalen)); + offset += bzdatalen; + if (fseeko(epf, offset, SEEK_SET)) + err(1, "fseeko(%s, %jd)", argv[3], (intmax_t)offset); if ((epfbz2 = BZ2_bzReadOpen(&ebz2err, epf, 0, 0, NULL, 0)) == NULL) errx(1, "BZ2_bzReadOpen, bz2err = %d", ebz2err); |