diff options
author | David Kalnischkies <david@kalnischkies.de> | 2014-03-21 11:04:26 +0100 |
---|---|---|
committer | David Kalnischkies <david@kalnischkies.de> | 2014-03-21 11:04:26 +0100 |
commit | c4b113e650dbdbb4c5c9c6f36437c94db6b214d9 (patch) | |
tree | 00c29e301c1b884aad6fb121a0010f0f6af45169 | |
parent | b68ce88357daf362e60d7f8f131041289c8db690 (diff) |
continue reading in xz even if it outputs nothing
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>
-rw-r--r-- | apt-pkg/contrib/fileutl.cc | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/apt-pkg/contrib/fileutl.cc b/apt-pkg/contrib/fileutl.cc index ba79720d8..69406a9bf 100644 --- a/apt-pkg/contrib/fileutl.cc +++ b/apt-pkg/contrib/fileutl.cc @@ -1430,7 +1430,15 @@ bool FileFd::Read(void *To,unsigned long long Size,unsigned long long *Actual) errno = 0; } else + { Res = Size - d->lzma->stream.avail_out; + if (Res == 0) + { + // lzma run was okay, but produced no output… + Res = -1; + errno = EINTR; + } + } } #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) + { + // trick the while-loop into running again + Res = 1; + errno = 0; continue; + } if (false) /* dummy so that the rest can be 'else if's */; #ifdef HAVE_ZLIB |