From 357099c220379c6e8d99869e66f4f44625e0d3c4 Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Wed, 28 Jul 2021 12:06:52 +0200 Subject: [PATCH 1/2] 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 8f895ac1..279f0403 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 30d3bead..caebe49f 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 From a7eaba90ef3c559bb81036d2b46e820b1b5bcfbd Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Wed, 28 Jul 2021 16:31:02 +0200 Subject: [PATCH 2/2] Apply suggestions from code review Co-authored-by: Andrew Arnott --- src/NerdBank.GitVersioning/ManagedGit/GitPackReader.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NerdBank.GitVersioning/ManagedGit/GitPackReader.cs b/src/NerdBank.GitVersioning/ManagedGit/GitPackReader.cs index caebe49f..a1eba9ae 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 = offset - baseObjectRelativeOffset; + long baseObjectOffset = offset - baseObjectRelativeOffset; var deltaStream = new ZLibStream(stream, decompressedSize); var baseObjectStream = pack.GetObject(baseObjectOffset, objectType);