From a5b16a54a5b7b7d8bd04e504e6c99da8c142f0b8 Mon Sep 17 00:00:00 2001 From: delphij Date: Sat, 14 Mar 2020 05:57:22 +0000 Subject: [PATCH] Remove unneeded checks for prelen. In order to determine the type of a compressed file, we have to read in the first four bytes which may also be important for decompression purposes, to do that we would pass the buffer that we have already read in, along with the size of it. Rename header1 to fourbytes to make that explicit, and remove all checks for prelen. Reported by: cem Reviewed by: cem MFC after: 2 weeks Differential Revision: https://reviews.freebsd.org/D24034 --- usr.bin/gzip/gzip.c | 34 +++++++++++++++++----------------- usr.bin/gzip/unlz.c | 2 -- usr.bin/gzip/unpack.c | 3 --- 3 files changed, 17 insertions(+), 22 deletions(-) diff --git a/usr.bin/gzip/gzip.c b/usr.bin/gzip/gzip.c index b348733eee6b..47cfd225b844 100644 --- a/usr.bin/gzip/gzip.c +++ b/usr.bin/gzip/gzip.c @@ -1443,7 +1443,7 @@ file_uncompress(char *file, char *outfile, size_t outsize) struct stat isb, osb; off_t size; ssize_t rbytes; - unsigned char header1[4]; + unsigned char fourbytes[4]; enum filetype method; int fd, ofd, zfd = -1; int error; @@ -1477,8 +1477,8 @@ file_uncompress(char *file, char *outfile, size_t outsize) goto lose; } - rbytes = read(fd, header1, sizeof header1); - if (rbytes != sizeof header1) { + rbytes = read(fd, fourbytes, sizeof fourbytes); + if (rbytes != sizeof fourbytes) { /* we don't want to fail here. */ #ifndef SMALL if (fflag) @@ -1492,7 +1492,7 @@ file_uncompress(char *file, char *outfile, size_t outsize) } infile_newdata(rbytes); - method = file_gettype(header1); + method = file_gettype(fourbytes); #ifndef SMALL if (fflag == 0 && method == FT_UNKNOWN) { maybe_warnx("%s: not in gzip format", file); @@ -1516,7 +1516,7 @@ file_uncompress(char *file, char *outfile, size_t outsize) infile_newdata(rv); timestamp = le32dec(&ts[0]); - if (header1[3] & ORIG_NAME) { + if (fourbytes[3] & ORIG_NAME) { rbytes = pread(fd, name, sizeof(name) - 1, GZIP_ORIGNAME); if (rbytes < 0) { maybe_warn("can't read %s", file); @@ -1818,7 +1818,7 @@ static void handle_stdin(void) { struct stat isb; - unsigned char header1[4]; + unsigned char fourbytes[4]; size_t in_size; off_t usize, gsize; enum filetype method; @@ -1849,16 +1849,16 @@ handle_stdin(void) goto out; } - bytes_read = read_retry(STDIN_FILENO, header1, sizeof header1); + bytes_read = read_retry(STDIN_FILENO, fourbytes, sizeof fourbytes); if (bytes_read == -1) { maybe_warn("can't read stdin"); goto out; - } else if (bytes_read != sizeof(header1)) { + } else if (bytes_read != sizeof(fourbytes)) { maybe_warnx("(stdin): unexpected end of file"); goto out; } - method = file_gettype(header1); + method = file_gettype(fourbytes); switch (method) { default: #ifndef SMALL @@ -1866,17 +1866,17 @@ handle_stdin(void) maybe_warnx("unknown compression format"); goto out; } - usize = cat_fd(header1, sizeof header1, &gsize, STDIN_FILENO); + usize = cat_fd(fourbytes, sizeof fourbytes, &gsize, STDIN_FILENO); break; #endif case FT_GZIP: usize = gz_uncompress(STDIN_FILENO, STDOUT_FILENO, - (char *)header1, sizeof header1, &gsize, "(stdin)"); + (char *)fourbytes, sizeof fourbytes, &gsize, "(stdin)"); break; #ifndef NO_BZIP2_SUPPORT case FT_BZIP2: usize = unbzip2(STDIN_FILENO, STDOUT_FILENO, - (char *)header1, sizeof header1, &gsize); + (char *)fourbytes, sizeof fourbytes, &gsize); break; #endif #ifndef NO_COMPRESS_SUPPORT @@ -1886,27 +1886,27 @@ handle_stdin(void) goto out; } - usize = zuncompress(in, stdout, (char *)header1, - sizeof header1, &gsize); + usize = zuncompress(in, stdout, (char *)fourbytes, + sizeof fourbytes, &gsize); fclose(in); break; #endif #ifndef NO_PACK_SUPPORT case FT_PACK: usize = unpack(STDIN_FILENO, STDOUT_FILENO, - (char *)header1, sizeof header1, &gsize); + (char *)fourbytes, sizeof fourbytes, &gsize); break; #endif #ifndef NO_XZ_SUPPORT case FT_XZ: usize = unxz(STDIN_FILENO, STDOUT_FILENO, - (char *)header1, sizeof header1, &gsize); + (char *)fourbytes, sizeof fourbytes, &gsize); break; #endif #ifndef NO_LZ_SUPPORT case FT_LZ: usize = unlz(STDIN_FILENO, STDOUT_FILENO, - (char *)header1, sizeof header1, &gsize); + (char *)fourbytes, sizeof fourbytes, &gsize); break; #endif } diff --git a/usr.bin/gzip/unlz.c b/usr.bin/gzip/unlz.c index f3c20ecb0f49..0bfea3f439d3 100644 --- a/usr.bin/gzip/unlz.c +++ b/usr.bin/gzip/unlz.c @@ -618,8 +618,6 @@ unlz(int fin, int fout, char *pre, size_t prelen, off_t *bytes_in) char header[HDR_SIZE]; - if (prelen > sizeof(header)) - return -1; if (pre && prelen) memcpy(header, pre, prelen); diff --git a/usr.bin/gzip/unpack.c b/usr.bin/gzip/unpack.c index 5ddb8d3fdf86..2ebfaf108be4 100644 --- a/usr.bin/gzip/unpack.c +++ b/usr.bin/gzip/unpack.c @@ -156,9 +156,6 @@ unpack_parse_header(int in, int out, char *pre, size_t prelen, off_t *bytes_in, ssize_t bytesread; /* Bytes read from the file */ int i, j, thisbyte; - if (prelen > sizeof hdr) - maybe_err("prelen too long"); - /* Prepend the header buffer if we already read some data */ if (prelen != 0) memcpy(hdr, pre, prelen);