From 8caabe19ec31e101a51c2ad7b493359d5d2f731c Mon Sep 17 00:00:00 2001 From: tjr Date: Sun, 2 May 2004 02:54:37 +0000 Subject: Apply patch from gzip web page to correctly decompress files larger than 4GB on architectures with 64-bit long integers. --- gnu/usr.bin/gzip/unzip.c | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) (limited to 'gnu/usr.bin') diff --git a/gnu/usr.bin/gzip/unzip.c b/gnu/usr.bin/gzip/unzip.c index e36555a..f06994f 100644 --- a/gnu/usr.bin/gzip/unzip.c +++ b/gnu/usr.bin/gzip/unzip.c @@ -35,6 +35,7 @@ static char rcsid[] = "$FreeBSD$"; #define LOCEXT 28 /* offset of extra field length */ #define LOCHDR 30 /* size of local header, including sig */ #define EXTHDR 16 /* size of extended local header, inc sig */ +#define RAND_HEAD_LEN 12 /* length of encryption random header */ /* Globals */ @@ -103,6 +104,7 @@ int unzip(in, out) ulg orig_len = 0; /* original uncompressed length */ int n; uch buf[EXTHDR]; /* extended local header */ + int err = OK; ifd = in; ofd = out; @@ -136,9 +138,6 @@ int unzip(in, out) } while (n--) { uch c = (uch)get_byte(); -#ifdef CRYPT - if (decrypt) zdecode(c); -#endif put_ubyte(c); } flush_window(); @@ -172,10 +171,14 @@ int unzip(in, out) /* Validate decompression */ if (orig_crc != updcrc(outbuf, 0)) { - error("invalid compressed data--crc error"); + fprintf(stderr, "\n%s: %s: invalid compressed data--crc error\n", + progname, ifname); + err = ERROR; } - if (orig_len != (ulg)bytes_out) { - error("invalid compressed data--length error"); + if (((orig_len - (ulg)bytes_out) & 0x0ffffffffL) != 0) { + fprintf(stderr, "\n%s: %s: invalid compressed data--length error\n", + progname, ifname); + err = ERROR; } /* Check if there are more entries in a pkzip file */ @@ -189,11 +192,12 @@ int unzip(in, out) fprintf(stderr, "%s: %s has more than one entry -- unchanged\n", progname, ifname); - exit_code = ERROR; - ext_header = pkzip = 0; - return ERROR; + err = ERROR; } } ext_header = pkzip = 0; /* for next file */ - return OK; + if (err == OK) return OK; + exit_code = ERROR; + if (!test) abort_gzip(); + return err; } -- cgit v1.1