Skip to content

Commit 1ccaefa

Browse files
Update src/OrasProject.Oras/Content/File/TarUtilities.cs
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Signed-off-by: Xiaoxuan Wang <wangxiaoxuan119@gmail.com>
1 parent e0584e8 commit 1ccaefa

File tree

1 file changed

+29
-39
lines changed

1 file changed

+29
-39
lines changed

src/OrasProject.Oras/Content/File/TarUtilities.cs

Lines changed: 29 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -176,54 +176,44 @@ internal static async Task ExtractTarGzipAsync(
176176
var decompressedStream = new GZipStream(gzipStream, CompressionMode.Decompress);
177177
await using var _2 = decompressedStream.ConfigureAwait(false);
178178

179-
Stream sourceStream = decompressedStream;
180-
IncrementalHash? hash = null;
181-
MemoryStream? bufferedStream = null;
182-
183-
try
179+
if (string.IsNullOrEmpty(checksum))
184180
{
185-
// If we have a checksum, we need to verify the content
186-
if (!string.IsNullOrEmpty(checksum))
187-
{
188-
hash = IncrementalHash.CreateHash(HashAlgorithmName.SHA256);
189-
190-
// Read the entire decompressed content for hashing
191-
bufferedStream = new MemoryStream();
192-
var buffer = new byte[_bufferSize];
193-
int bytesRead;
194-
while ((bytesRead = await decompressedStream.ReadAsync(buffer.AsMemory(0, buffer.Length), cancellationToken).ConfigureAwait(false)) > 0)
195-
{
196-
hash.AppendData(buffer.AsSpan(0, bytesRead));
197-
await bufferedStream.WriteAsync(buffer.AsMemory(0, bytesRead), cancellationToken).ConfigureAwait(false);
198-
}
199-
200-
// Verify the checksum
201-
var computedHash = hash.GetHashAndReset();
202-
var computedDigest = $"sha256:{Convert.ToHexString(computedHash).ToLowerInvariant()}";
203-
if (!string.Equals(computedDigest, checksum, StringComparison.OrdinalIgnoreCase))
204-
{
205-
throw new InvalidOperationException($"Content digest mismatch: expected {checksum}, got {computedDigest}");
206-
}
207-
208-
bufferedStream.Position = 0;
209-
sourceStream = bufferedStream;
210-
}
211-
212181
await ExtractTarDirectoryAsync(
213182
targetDirectory,
214183
directoryName,
215-
sourceStream,
184+
decompressedStream,
216185
preservePermissions,
217186
cancellationToken).ConfigureAwait(false);
187+
return;
218188
}
219-
finally
189+
190+
using var hash = IncrementalHash.CreateHash(HashAlgorithmName.SHA256);
191+
await using var bufferedStream = new MemoryStream();
192+
193+
var buffer = new byte[_bufferSize];
194+
int bytesRead;
195+
while ((bytesRead = await decompressedStream.ReadAsync(buffer.AsMemory(0, buffer.Length), cancellationToken).ConfigureAwait(false)) > 0)
220196
{
221-
hash?.Dispose();
222-
if (bufferedStream != null)
223-
{
224-
await bufferedStream.DisposeAsync().ConfigureAwait(false);
225-
}
197+
hash.AppendData(buffer.AsSpan(0, bytesRead));
198+
await bufferedStream.WriteAsync(buffer.AsMemory(0, bytesRead), cancellationToken).ConfigureAwait(false);
226199
}
200+
201+
// Verify the checksum
202+
var computedHash = hash.GetHashAndReset();
203+
var computedDigest = $"sha256:{Convert.ToHexString(computedHash).ToLowerInvariant()}";
204+
if (!string.Equals(computedDigest, checksum, StringComparison.OrdinalIgnoreCase))
205+
{
206+
throw new InvalidOperationException($"Content digest mismatch: expected {checksum}, got {computedDigest}");
207+
}
208+
209+
bufferedStream.Position = 0;
210+
211+
await ExtractTarDirectoryAsync(
212+
targetDirectory,
213+
directoryName,
214+
bufferedStream,
215+
preservePermissions,
216+
cancellationToken).ConfigureAwait(false);
227217
}
228218

229219
/// <summary>

0 commit comments

Comments
 (0)