-----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----- Index: unbzip2.c =================================================================== --- unbzip2.c (revision 199258) +++ unbzip2.c (working copy) _at__at_ -71,7 +71,7 _at__at_ 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; _at__at_ -86,8 +86,9 _at__at_ 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;Received on Fri Nov 13 2009 - 22:28:11 UTC
This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:39:58 UTC