]> git.saurik.com Git - apt.git/commitdiff
continue reading in xz even if it outputs nothing
authorDavid Kalnischkies <david@kalnischkies.de>
Fri, 21 Mar 2014 10:04:26 +0000 (11:04 +0100)
committerDavid Kalnischkies <david@kalnischkies.de>
Fri, 21 Mar 2014 10:04:26 +0000 (11:04 +0100)
It can happen that content in our buffer is not enough to produce a
meaningful output in which case no output is created by liblzma, but
still reports that everything is okay and we should go on.

The code assumes it has reached the end through if it encounters a null
read, so this commit makes it so that it looks like this read was
interrupted just like the lowlevel read() on uncompressed files could.

It subsequently fixes the issue with that as well as until now our loop
would still break even if we wanted it to continue on.

(This bug triggers our usual "Hash sum mismatch" error)

Reported-By: Stefan Lippers-Hollmann <s.L-H@gmx.de>
apt-pkg/contrib/fileutl.cc

index ba79720d803e01ce7dc28836bf8fdea3ee3dc845..69406a9bf11f30c348cce891e7ec494f9c971f56 100644 (file)
@@ -1430,7 +1430,15 @@ bool FileFd::Read(void *To,unsigned long long Size,unsigned long long *Actual)
            errno = 0;
         }
         else
            errno = 0;
         }
         else
+        {
            Res = Size - d->lzma->stream.avail_out;
            Res = Size - d->lzma->stream.avail_out;
+           if (Res == 0)
+           {
+              // lzma run was okay, but produced no output…
+              Res = -1;
+              errno = EINTR;
+           }
+        }
       }
 #endif
       else
       }
 #endif
       else
@@ -1439,7 +1447,12 @@ bool FileFd::Read(void *To,unsigned long long Size,unsigned long long *Actual)
       if (Res < 0)
       {
         if (errno == EINTR)
       if (Res < 0)
       {
         if (errno == EINTR)
+        {
+           // trick the while-loop into running again
+           Res = 1;
+           errno = 0;
            continue;
            continue;
+        }
         if (false)
            /* dummy so that the rest can be 'else if's */;
 #ifdef HAVE_ZLIB
         if (false)
            /* dummy so that the rest can be 'else if's */;
 #ifdef HAVE_ZLIB