svn commit: r199066 - head/usr.bin/gzip

Xin LI delphij at delphij.net
Fri Nov 13 23:28:11 UTC 2009


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Xin LI wrote:
> Xin LI wrote:
>> Anonymous wrote:
>>> Xin LI <delphij at FreeBSD.org> writes:
>>>> Author: delphij
>>>> Date: Mon Nov  9 02:37:02 2009
>>>> New Revision: 199066
>>>> URL: http://svn.freebsd.org/changeset/base/199066
>>>>
>>>> Log:
>>>>   Apply a NetBSD fix (revision 1.12) to handle multi-session bzip2 files
>>>>   as created by pbzip2.
>>>>   
>>>>   Submitted by:	mrg (NetBSD.org)
>>>>   MFC after:	1 week
>>>>
>>>> Modified:
>>>>   head/usr.bin/gzip/unbzip2.c
>>>>
>>>     $ touch blah
>>>     $ bzip2 blah
>>>     $ gzip -d blah.bz2
>>>     gzip: read: No such file or directory
>>>     Exit 2
>>> Regression? Can you reproduce?
>> Yes, this is a regression (confirmed that this behavior is different
>> from bzip2 and a regression from 199065).  Thanks for your report and
>> I'll investigate what's happening.
> 
> I think the attached patch should fixed this issue.  Could you please test?

The previous fix has introduced an issue that revealed another bug as
well (gzip -d -c can't decompress large-ish input stream, i.e. something
like bzip2 -c ObsoleteFiles.inc | gunzip -d -c).  The proposed patch:

 * Set end_of_file flag if we hit a short read.  This usually saves one
read after the actual end of file.
 * Only bail out when BZ_OK and end_of_file and no output is given from
decompression engine.  This would fix the streaming issue.
 * Use maybe_errx() instead of maybe_err - We don't have a valid errno
at hand at the point we have received BZ_OK, and make the information
more meaningful.

Cheers,
- --
Xin LI <delphij at delphij.net>	http://www.delphij.net/
FreeBSD - The Power to Serve!	       Live free or die
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2.0.13 (FreeBSD)

iEYEARECAAYFAkr963AACgkQi+vbBBjt66CqEwCffIgM9W25Tjdu2zlNGfarpKyS
oYwAoI+oVyjIdMdZo8VXN/TwfHhm0P2P
=zSGu
-----END PGP SIGNATURE-----
-------------- next part --------------
Index: unbzip2.c
===================================================================
--- unbzip2.c	(revision 199258)
+++ unbzip2.c	(working copy)
@@ -71,7 +71,7 @@
 	                n = read(in, inbuf, BUFLEN);
 	                if (n < 0)
 	                        maybe_err("read");
-	                if (n == 0)
+	                if (n < BUFLEN)
 	                        end_of_file = 1;
 	                bzs.next_in = inbuf;
 	                bzs.avail_in = n;
@@ -86,8 +86,9 @@
 	        switch (ret) {
 	        case BZ_STREAM_END:
 	        case BZ_OK:
-	                if (ret == BZ_OK && end_of_file)
-	                        maybe_err("read");
+	                if (ret == BZ_OK && end_of_file &&
+			    bzs.avail_out == BUFLEN)
+	                        maybe_errx("truncated file");
 	                if (!tflag && bzs.avail_out != BUFLEN) {
 				ssize_t	n;
 


More information about the freebsd-current mailing list