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. 14
      org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackFile.java

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

Loading…
Cancel
Save