IndexPack: Fix spurious pack file corruption errors

We didn't correctly handle the zlib trailer for an object.  If the
trailer bytes were outside of the current buffer window but we had
fully inflated the object itself, we broke out of the loop (as we had
our target size) but inflate wasn't finished (as it did not yet get
the trailer) so we failed the test and threw a corruption exception.

Use an infinite loop and only break out when the inflater is done.

Change-Id: I7c9bbbeb577a990d9bc56a50ebd485935460f6c8
Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
This commit is contained in:
Shawn O. Pearce 2010-07-20 07:40:48 -07:00
parent ec13e0382a
commit b518189b5c
1 changed files with 3 additions and 3 deletions

View File

@ -961,7 +961,7 @@ private void inflate(final Source src, final long inflatedSize,
int p = fill(src, 24);
inf.setInput(buf, p, bAvail);
do {
for (;;) {
int r = inf.inflate(dst, off, dst.length - off);
if (r == 0) {
if (inf.finished())
@ -982,9 +982,9 @@ private void inflate(final Source src, final long inflatedSize,
cnt += r;
if (keep)
off += r;
} while (cnt < inflatedSize);
}
if (!inf.finished() || cnt != inflatedSize) {
if (cnt != inflatedSize) {
throw new CorruptObjectException(MessageFormat.format(JGitText
.get().packfileCorruptionDetected,
JGitText.get().wrongDecompressedLength));