From b9f21417b2dccd42d6ca161b2e9b21cf12244fdd Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Wed, 28 Jul 2021 12:06:52 +0200 Subject: [PATCH] Fix bugs with > 2 GB pack files --- .../ManagedGit/GitPackIndexMappedReader.cs | 2 +- src/NerdBank.GitVersioning/ManagedGit/GitPackReader.cs | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/NerdBank.GitVersioning/ManagedGit/GitPackIndexMappedReader.cs b/src/NerdBank.GitVersioning/ManagedGit/GitPackIndexMappedReader.cs index 8f895ac11..279f0403f 100644 --- a/src/NerdBank.GitVersioning/ManagedGit/GitPackIndexMappedReader.cs +++ b/src/NerdBank.GitVersioning/ManagedGit/GitPackIndexMappedReader.cs @@ -128,7 +128,7 @@ public override (long?, GitObjectId?) GetOffset(Span objectName, bool ends { // If the first bit of the offset address is set, the offset is stored as a 64-bit value in the table of 8-byte offset entries, // which follows the table of 4-byte offset entries: "large offsets are encoded as an index into the next table with the msbit set." - offset = offset & 0x7FF; + offset = offset & 0x7FFFFFFF; offsetBuffer = this.Value.Slice(offsetTableStart + 4 * objectCount + 8 * (int)offset, 8); var offset64 = BinaryPrimitives.ReadInt64BigEndian(offsetBuffer); diff --git a/src/NerdBank.GitVersioning/ManagedGit/GitPackReader.cs b/src/NerdBank.GitVersioning/ManagedGit/GitPackReader.cs index 30d3bead5..caebe49f9 100644 --- a/src/NerdBank.GitVersioning/ManagedGit/GitPackReader.cs +++ b/src/NerdBank.GitVersioning/ManagedGit/GitPackReader.cs @@ -44,7 +44,7 @@ public static Stream GetObject(GitPack pack, Stream stream, long offset, string if (type == GitPackObjectType.OBJ_OFS_DELTA) { var baseObjectRelativeOffset = ReadVariableLengthInteger(stream); - var baseObjectOffset = (int)(offset - baseObjectRelativeOffset); + var baseObjectOffset = offset - baseObjectRelativeOffset; var deltaStream = new ZLibStream(stream, decompressedSize); var baseObjectStream = pack.GetObject(baseObjectOffset, objectType); @@ -98,9 +98,9 @@ private static (GitPackObjectType, long) ReadObjectHeader(Stream stream) return (type, length); } - private static int ReadVariableLengthInteger(Stream stream) + private static long ReadVariableLengthInteger(Stream stream) { - int offset = -1; + long offset = -1; int b; do