Browse Source

Ignore bitmap indexes that do not match the pack checksum

If `git gc` creates a new pack with the same file name, the
pack checksum may not match that in the .bitmap. Fix the PackFile
implementaion to silently ignore invalid bitmap indexes.

Fixes Issue https://code.google.com/p/gerrit/issues/detail?id=2131

Change-Id: I378673c00de32385ba90f4b639cb812f9574a216
stable-3.1
Colby Ranger 11 years ago
parent
commit
570bba5e7a
  1. 16
      org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackFile.java

16
org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackFile.java

@ -121,6 +121,8 @@ public class PackFile implements Iterable<PackIndex.MutableEntry> {
private volatile boolean invalid;
private boolean invalidBitmap;
private byte[] packChecksum;
private PackIndex loadedIdx;
@ -1057,19 +1059,17 @@ public class PackFile implements Iterable<PackIndex.MutableEntry> {
}
synchronized PackBitmapIndex getBitmapIndex() throws IOException {
if (invalid)
if (invalid || invalidBitmap)
return null;
if (bitmapIdx == null && hasExt(BITMAP_INDEX)) {
final PackBitmapIndex idx = PackBitmapIndex.open(
extFile(BITMAP_INDEX), idx(), getReverseIdx());
if (packChecksum == null)
packChecksum = idx.packChecksum;
else if (!Arrays.equals(packChecksum, idx.packChecksum))
throw new PackMismatchException(
JGitText.get().packChecksumMismatch);
bitmapIdx = idx;
// At this point, idx() will have set packChecksum.
if (Arrays.equals(packChecksum, idx.packChecksum))
bitmapIdx = idx;
else
invalidBitmap = true;
}
return bitmapIdx;
}

Loading…
Cancel
Save