Author: delphij
Date: Mon Nov 16 22:52:52 2009
New Revision: 199339
URL: http://svn.freebsd.org/changeset/base/199339

Log:
  We should distinguish between a real truncated case and EOF after
  BZ_STREAM_END triggered re-init.  Do it by introducing a new flag
  to represent the 'cold' case after bzip2 state is reinitialized.
  
  This fixes regression reported on -current@ as well as another one
  I found during twiddling with gzip.
  
  Reported by:  swell.k gmail.com
  MFC after:    1 week

Modified:
  head/usr.bin/gzip/unbzip2.c

Modified: head/usr.bin/gzip/unbzip2.c
==============================================================================
--- head/usr.bin/gzip/unbzip2.c Mon Nov 16 21:53:56 2009        (r199338)
+++ head/usr.bin/gzip/unbzip2.c Mon Nov 16 22:52:52 2009        (r199339)
@@ -36,7 +36,7 @@
 static off_t
 unbzip2(int in, int out, char *pre, size_t prelen, off_t *bytes_in)
 {
-       int             ret, end_of_file;
+       int             ret, end_of_file, cold = 0;
        off_t           bytes_out = 0;
        bz_stream       bzs;
        static char     *inbuf, *outbuf;
@@ -86,8 +86,18 @@ unbzip2(int in, int out, char *pre, size
                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) {
+                               /*
+                                * If we hit this after a stream end, consider
+                                * it as the end of the whole file and don't
+                                * bail out.
+                                */
+                               if (cold == 1)
+                                       ret = BZ_STREAM_END;
+                               else
+                                       maybe_errx("truncated file");
+                       }
+                       cold = 0;
                        if (!tflag && bzs.avail_out != BUFLEN) {
                                ssize_t n;
 
@@ -100,6 +110,7 @@ unbzip2(int in, int out, char *pre, size
                                if (BZ2_bzDecompressEnd(&bzs) != BZ_OK ||
                                    BZ2_bzDecompressInit(&bzs, 0, 0) != BZ_OK)
                                        maybe_errx("bzip2 re-init");
+                               cold = 1;
                                ret = BZ_OK;
                        }
                        break;
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to