From 3bac5b1d7d85aba3ec4aea0286eabbc8b326208b Mon Sep 17 00:00:00 2001 From: "Shawn O. Pearce" Date: Fri, 5 Aug 2011 18:18:16 -0700 Subject: [PATCH] Fix offset64 creation for objects at 2 GiB The offset32 format is used for objects <= 2^31-1, while the offset64 format is used for all other objects. This condition was missing the = needed to ensure an object placed exactly at 2^31 would have its 64 bit offset in the index. Change-Id: I293fac0e829c9baa12cb59411dffde666051d6c5 Signed-off-by: Shawn O. Pearce --- .../org/eclipse/jgit/storage/file/PackIndexWriterV2.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/PackIndexWriterV2.java b/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/PackIndexWriterV2.java index 21ebd1ca9..7671cd6f1 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/PackIndexWriterV2.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/PackIndexWriterV2.java @@ -56,6 +56,9 @@ * @see PackIndexV2 */ class PackIndexWriterV2 extends PackIndexWriter { + private static final int MAX_OFFSET_32 = 0x7fffffff; + private static final int IS_OFFSET_64 = 0x80000000; + PackIndexWriterV2(final OutputStream dst) { super(dst); } @@ -87,10 +90,10 @@ private void writeOffset32() throws IOException { int o64 = 0; for (final PackedObjectInfo oe : entries) { final long o = oe.getOffset(); - if (o < Integer.MAX_VALUE) + if (o <= MAX_OFFSET_32) NB.encodeInt32(tmp, 0, (int) o); else - NB.encodeInt32(tmp, 0, (1 << 31) | o64++); + NB.encodeInt32(tmp, 0, IS_OFFSET_64 | o64++); out.write(tmp, 0, 4); } } @@ -98,7 +101,7 @@ private void writeOffset32() throws IOException { private void writeOffset64() throws IOException { for (final PackedObjectInfo oe : entries) { final long o = oe.getOffset(); - if (o > Integer.MAX_VALUE) { + if (MAX_OFFSET_32 < o) { NB.encodeInt64(tmp, 0, o); out.write(tmp, 0, 8); }