Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions src/ICSharpCode.SharpZipLib/Zip/ZipFile.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2466,10 +2466,10 @@ private int GetDescriptorSize(ZipUpdate update)
int result = 0;
if ((update.Entry.Flags & (int)GeneralBitFlags.Descriptor) != 0)
{
result = ZipConstants.DataDescriptorSize - 4;
result = ZipConstants.DataDescriptorSize;
if (update.Entry.LocalHeaderRequiresZip64)
{
result = ZipConstants.Zip64DataDescriptorSize - 4;
result = ZipConstants.Zip64DataDescriptorSize;
}
}
return result;
Expand Down
83 changes: 83 additions & 0 deletions test/ICSharpCode.SharpZipLib.Tests/Zip/ZipFileHandling.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1611,5 +1611,88 @@ public void AddFileWithAlternateName()
}
}
}

/// <summary>
/// Test for https://github.com/icsharpcode/SharpZipLib/issues/147, when deleting items in a zip
/// </summary>
/// <param name="useZip64">Whether Zip64 should be used in the test archive</param>
[TestCase(UseZip64.On)]
[TestCase(UseZip64.Off)]
[Category("Zip")]
public void TestDescriptorUpdateOnDelete(UseZip64 useZip64)
{
MemoryStream msw = new MemoryStreamWithoutSeek();
using (ZipOutputStream outStream = new ZipOutputStream(msw))
{
outStream.UseZip64 = useZip64;
outStream.IsStreamOwner = false;
outStream.PutNextEntry(new ZipEntry("StripedMarlin"));
outStream.WriteByte(89);

outStream.PutNextEntry(new ZipEntry("StripedMarlin2"));
outStream.WriteByte(91);
}

var zipData = msw.ToArray();
Assert.IsTrue(ZipTesting.TestArchive(zipData));

using (var memoryStream = new MemoryStream(zipData))
{
using (var zipFile = new ZipFile(memoryStream, leaveOpen: true))
{
zipFile.BeginUpdate();
zipFile.Delete("StripedMarlin");
zipFile.CommitUpdate();
}

memoryStream.Position = 0;

using (var zipFile = new ZipFile(memoryStream, leaveOpen: true))
{
Assert.That(zipFile.TestArchive(true), Is.True);
}
}
}

/// <summary>
/// Test for https://github.com/icsharpcode/SharpZipLib/issues/147, when adding items to a zip
/// </summary>
/// <param name="useZip64">Whether Zip64 should be used in the test archive</param>
[TestCase(UseZip64.On)]
[TestCase(UseZip64.Off)]
[Category("Zip")]
public void TestDescriptorUpdateOnAdd(UseZip64 useZip64)
{
MemoryStream msw = new MemoryStreamWithoutSeek();
using (ZipOutputStream outStream = new ZipOutputStream(msw))
{
outStream.UseZip64 = useZip64;
outStream.IsStreamOwner = false;
outStream.PutNextEntry(new ZipEntry("StripedMarlin"));
outStream.WriteByte(89);
}

var zipData = msw.ToArray();
Assert.IsTrue(ZipTesting.TestArchive(zipData));

using (var memoryStream = new MemoryStream())
{
memoryStream.Write(zipData, 0, zipData.Length);

using (var zipFile = new ZipFile(memoryStream, leaveOpen: true))
{
zipFile.BeginUpdate();
zipFile.Add(new StringMemoryDataSource("stripey"), "Zebra");
zipFile.CommitUpdate();
}

memoryStream.Position = 0;

using (var zipFile = new ZipFile(memoryStream, leaveOpen: true))
{
Assert.That(zipFile.TestArchive(true), Is.True);
}
}
}
}
}