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
This commit is contained in:
parent
4c48a26a9e
commit
a5b16a54a5
@ -1443,7 +1443,7 @@ file_uncompress(char *file, char *outfile, size_t outsize)
|
|||||||
struct stat isb, osb;
|
struct stat isb, osb;
|
||||||
off_t size;
|
off_t size;
|
||||||
ssize_t rbytes;
|
ssize_t rbytes;
|
||||||
unsigned char header1[4];
|
unsigned char fourbytes[4];
|
||||||
enum filetype method;
|
enum filetype method;
|
||||||
int fd, ofd, zfd = -1;
|
int fd, ofd, zfd = -1;
|
||||||
int error;
|
int error;
|
||||||
@ -1477,8 +1477,8 @@ file_uncompress(char *file, char *outfile, size_t outsize)
|
|||||||
goto lose;
|
goto lose;
|
||||||
}
|
}
|
||||||
|
|
||||||
rbytes = read(fd, header1, sizeof header1);
|
rbytes = read(fd, fourbytes, sizeof fourbytes);
|
||||||
if (rbytes != sizeof header1) {
|
if (rbytes != sizeof fourbytes) {
|
||||||
/* we don't want to fail here. */
|
/* we don't want to fail here. */
|
||||||
#ifndef SMALL
|
#ifndef SMALL
|
||||||
if (fflag)
|
if (fflag)
|
||||||
@ -1492,7 +1492,7 @@ file_uncompress(char *file, char *outfile, size_t outsize)
|
|||||||
}
|
}
|
||||||
infile_newdata(rbytes);
|
infile_newdata(rbytes);
|
||||||
|
|
||||||
method = file_gettype(header1);
|
method = file_gettype(fourbytes);
|
||||||
#ifndef SMALL
|
#ifndef SMALL
|
||||||
if (fflag == 0 && method == FT_UNKNOWN) {
|
if (fflag == 0 && method == FT_UNKNOWN) {
|
||||||
maybe_warnx("%s: not in gzip format", file);
|
maybe_warnx("%s: not in gzip format", file);
|
||||||
@ -1516,7 +1516,7 @@ file_uncompress(char *file, char *outfile, size_t outsize)
|
|||||||
infile_newdata(rv);
|
infile_newdata(rv);
|
||||||
timestamp = le32dec(&ts[0]);
|
timestamp = le32dec(&ts[0]);
|
||||||
|
|
||||||
if (header1[3] & ORIG_NAME) {
|
if (fourbytes[3] & ORIG_NAME) {
|
||||||
rbytes = pread(fd, name, sizeof(name) - 1, GZIP_ORIGNAME);
|
rbytes = pread(fd, name, sizeof(name) - 1, GZIP_ORIGNAME);
|
||||||
if (rbytes < 0) {
|
if (rbytes < 0) {
|
||||||
maybe_warn("can't read %s", file);
|
maybe_warn("can't read %s", file);
|
||||||
@ -1818,7 +1818,7 @@ static void
|
|||||||
handle_stdin(void)
|
handle_stdin(void)
|
||||||
{
|
{
|
||||||
struct stat isb;
|
struct stat isb;
|
||||||
unsigned char header1[4];
|
unsigned char fourbytes[4];
|
||||||
size_t in_size;
|
size_t in_size;
|
||||||
off_t usize, gsize;
|
off_t usize, gsize;
|
||||||
enum filetype method;
|
enum filetype method;
|
||||||
@ -1849,16 +1849,16 @@ handle_stdin(void)
|
|||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
bytes_read = read_retry(STDIN_FILENO, header1, sizeof header1);
|
bytes_read = read_retry(STDIN_FILENO, fourbytes, sizeof fourbytes);
|
||||||
if (bytes_read == -1) {
|
if (bytes_read == -1) {
|
||||||
maybe_warn("can't read stdin");
|
maybe_warn("can't read stdin");
|
||||||
goto out;
|
goto out;
|
||||||
} else if (bytes_read != sizeof(header1)) {
|
} else if (bytes_read != sizeof(fourbytes)) {
|
||||||
maybe_warnx("(stdin): unexpected end of file");
|
maybe_warnx("(stdin): unexpected end of file");
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
method = file_gettype(header1);
|
method = file_gettype(fourbytes);
|
||||||
switch (method) {
|
switch (method) {
|
||||||
default:
|
default:
|
||||||
#ifndef SMALL
|
#ifndef SMALL
|
||||||
@ -1866,17 +1866,17 @@ handle_stdin(void)
|
|||||||
maybe_warnx("unknown compression format");
|
maybe_warnx("unknown compression format");
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
usize = cat_fd(header1, sizeof header1, &gsize, STDIN_FILENO);
|
usize = cat_fd(fourbytes, sizeof fourbytes, &gsize, STDIN_FILENO);
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
case FT_GZIP:
|
case FT_GZIP:
|
||||||
usize = gz_uncompress(STDIN_FILENO, STDOUT_FILENO,
|
usize = gz_uncompress(STDIN_FILENO, STDOUT_FILENO,
|
||||||
(char *)header1, sizeof header1, &gsize, "(stdin)");
|
(char *)fourbytes, sizeof fourbytes, &gsize, "(stdin)");
|
||||||
break;
|
break;
|
||||||
#ifndef NO_BZIP2_SUPPORT
|
#ifndef NO_BZIP2_SUPPORT
|
||||||
case FT_BZIP2:
|
case FT_BZIP2:
|
||||||
usize = unbzip2(STDIN_FILENO, STDOUT_FILENO,
|
usize = unbzip2(STDIN_FILENO, STDOUT_FILENO,
|
||||||
(char *)header1, sizeof header1, &gsize);
|
(char *)fourbytes, sizeof fourbytes, &gsize);
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
#ifndef NO_COMPRESS_SUPPORT
|
#ifndef NO_COMPRESS_SUPPORT
|
||||||
@ -1886,27 +1886,27 @@ handle_stdin(void)
|
|||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
usize = zuncompress(in, stdout, (char *)header1,
|
usize = zuncompress(in, stdout, (char *)fourbytes,
|
||||||
sizeof header1, &gsize);
|
sizeof fourbytes, &gsize);
|
||||||
fclose(in);
|
fclose(in);
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
#ifndef NO_PACK_SUPPORT
|
#ifndef NO_PACK_SUPPORT
|
||||||
case FT_PACK:
|
case FT_PACK:
|
||||||
usize = unpack(STDIN_FILENO, STDOUT_FILENO,
|
usize = unpack(STDIN_FILENO, STDOUT_FILENO,
|
||||||
(char *)header1, sizeof header1, &gsize);
|
(char *)fourbytes, sizeof fourbytes, &gsize);
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
#ifndef NO_XZ_SUPPORT
|
#ifndef NO_XZ_SUPPORT
|
||||||
case FT_XZ:
|
case FT_XZ:
|
||||||
usize = unxz(STDIN_FILENO, STDOUT_FILENO,
|
usize = unxz(STDIN_FILENO, STDOUT_FILENO,
|
||||||
(char *)header1, sizeof header1, &gsize);
|
(char *)fourbytes, sizeof fourbytes, &gsize);
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
#ifndef NO_LZ_SUPPORT
|
#ifndef NO_LZ_SUPPORT
|
||||||
case FT_LZ:
|
case FT_LZ:
|
||||||
usize = unlz(STDIN_FILENO, STDOUT_FILENO,
|
usize = unlz(STDIN_FILENO, STDOUT_FILENO,
|
||||||
(char *)header1, sizeof header1, &gsize);
|
(char *)fourbytes, sizeof fourbytes, &gsize);
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
@ -618,8 +618,6 @@ unlz(int fin, int fout, char *pre, size_t prelen, off_t *bytes_in)
|
|||||||
|
|
||||||
char header[HDR_SIZE];
|
char header[HDR_SIZE];
|
||||||
|
|
||||||
if (prelen > sizeof(header))
|
|
||||||
return -1;
|
|
||||||
if (pre && prelen)
|
if (pre && prelen)
|
||||||
memcpy(header, pre, prelen);
|
memcpy(header, pre, prelen);
|
||||||
|
|
||||||
|
@ -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 */
|
ssize_t bytesread; /* Bytes read from the file */
|
||||||
int i, j, thisbyte;
|
int i, j, thisbyte;
|
||||||
|
|
||||||
if (prelen > sizeof hdr)
|
|
||||||
maybe_err("prelen too long");
|
|
||||||
|
|
||||||
/* Prepend the header buffer if we already read some data */
|
/* Prepend the header buffer if we already read some data */
|
||||||
if (prelen != 0)
|
if (prelen != 0)
|
||||||
memcpy(hdr, pre, prelen);
|
memcpy(hdr, pre, prelen);
|
||||||
|
Loading…
Reference in New Issue
Block a user