]> source.dussan.org Git - jgit.git/commitdiff
IndexPack: Fix spurious pack file corruption errors 50/1150/1
authorShawn O. Pearce <spearce@spearce.org>
Tue, 20 Jul 2010 14:40:48 +0000 (07:40 -0700)
committerShawn O. Pearce <spearce@spearce.org>
Tue, 20 Jul 2010 14:40:48 +0000 (07:40 -0700)
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>
org.eclipse.jgit/src/org/eclipse/jgit/transport/IndexPack.java

index 789d8cdd74d0f97ff07ab30c2682fd2539af8799..491227d0917e9cc10e139b399b93cc811f67d547 100644 (file)
@@ -961,7 +961,7 @@ public class IndexPack {
                        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 @@ public class IndexPack {
                                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));