Skip to content

Commit fe9e0d8

Browse files
Numpsypiksel
authored andcommitted
Merge PR #314: Fix writing extra data when updating Zip64 entries
* Always write the Zip64 extra size fields when the base field is set to -1 * Unit test for removing entries from a Zip64 file
1 parent 4f541a4 commit fe9e0d8

File tree

2 files changed

+57
-2
lines changed

2 files changed

+57
-2
lines changed

src/ICSharpCode.SharpZipLib/Zip/ZipFile.cs

+6-2
Original file line numberDiff line numberDiff line change
@@ -2171,17 +2171,21 @@ private int WriteCentralDirectoryHeader(ZipEntry entry)
21712171
WriteLEInt((int)entry.Crc);
21722172
}
21732173

2174+
bool useExtraCompressedSize = false; //Do we want to store the compressed size in the extra data?
21742175
if ((entry.IsZip64Forced()) || (entry.CompressedSize >= 0xffffffff))
21752176
{
2177+
useExtraCompressedSize = true;
21762178
WriteLEInt(-1);
21772179
}
21782180
else
21792181
{
21802182
WriteLEInt((int)(entry.CompressedSize & 0xffffffff));
21812183
}
21822184

2185+
bool useExtraUncompressedSize = false; //Do we want to store the uncompressed size in the extra data?
21832186
if ((entry.IsZip64Forced()) || (entry.Size >= 0xffffffff))
21842187
{
2188+
useExtraUncompressedSize = true;
21852189
WriteLEInt(-1);
21862190
}
21872191
else
@@ -2205,12 +2209,12 @@ private int WriteCentralDirectoryHeader(ZipEntry entry)
22052209
{
22062210
ed.StartNewEntry();
22072211

2208-
if ((entry.Size >= 0xffffffff) || (useZip64_ == UseZip64.On))
2212+
if (useExtraUncompressedSize)
22092213
{
22102214
ed.AddLeLong(entry.Size);
22112215
}
22122216

2213-
if ((entry.CompressedSize >= 0xffffffff) || (useZip64_ == UseZip64.On))
2217+
if (useExtraCompressedSize)
22142218
{
22152219
ed.AddLeLong(entry.CompressedSize);
22162220
}

test/ICSharpCode.SharpZipLib.Tests/Zip/ZipFileHandling.cs

+51
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,57 @@ public void Zip64Useage()
136136
}
137137
}
138138

139+
/// <summary>
140+
/// Test that entries can be removed from a Zip64 file
141+
/// </summary>
142+
[Test]
143+
[Category("Zip")]
144+
public void Zip64Update()
145+
{
146+
using (var memStream = new MemoryStream())
147+
{
148+
using (ZipFile f = new ZipFile(memStream, leaveOpen: true))
149+
{
150+
f.UseZip64 = UseZip64.On;
151+
152+
var m = new StringMemoryDataSource("0000000");
153+
f.BeginUpdate(new MemoryArchiveStorage());
154+
f.Add(m, "a.dat");
155+
f.Add(m, "b.dat");
156+
f.CommitUpdate();
157+
Assert.That(f.TestArchive(true), Is.True, "initial archive should be valid");
158+
}
159+
160+
memStream.Seek(0, SeekOrigin.Begin);
161+
162+
using (ZipFile f = new ZipFile(memStream, leaveOpen: true))
163+
{
164+
Assert.That(f.Count, Is.EqualTo(2), "Archive should have 2 entries");
165+
166+
f.BeginUpdate(new MemoryArchiveStorage());
167+
f.Delete("b.dat");
168+
f.CommitUpdate();
169+
Assert.That(f.TestArchive(true), Is.True, "modified archive should be valid");
170+
}
171+
172+
memStream.Seek(0, SeekOrigin.Begin);
173+
174+
using (ZipFile f = new ZipFile(memStream, leaveOpen: true))
175+
{
176+
Assert.That(f.Count, Is.EqualTo(1), "Archive should have 1 entry");
177+
178+
for (int index = 0; index < f.Count; ++index)
179+
{
180+
Stream entryStream = f.GetInputStream(index);
181+
var data = new MemoryStream();
182+
StreamUtils.Copy(entryStream, data, new byte[128]);
183+
string contents = Encoding.ASCII.GetString(data.ToArray());
184+
Assert.That(contents, Is.EqualTo("0000000"), "archive member data should be correct");
185+
}
186+
}
187+
}
188+
}
189+
139190
[Test]
140191
[Category("Zip")]
141192
[Explicit]

0 commit comments

Comments
 (0)