Fixed bug causing entries of non-ustar archive being after one with very long name to be discarded

This commit is contained in:
Strachu
2014-12-16 11:11:02 +01:00
parent 2e533f9fb5
commit 8fcb0cb7a2
3 changed files with 22 additions and 8 deletions

View File

@@ -30,13 +30,17 @@ namespace SharpCompress.Test
[TestMethod]
public void TarArchivePathReadLongName()
public void Tar_NonUstarArchiveWithLongNameDoesNotSkipEntriesAfterTheLongOne()
{
string unmodified = Path.Combine(TEST_ARCHIVES_PATH, "very long filename.tar");
using (var archive = TarArchive.Open(unmodified))
{
Assert.AreEqual(2, archive.Entries.Count);
Assert.AreEqual(archive.Entries.Last().Key, @"very long filename/very long filename very long filename very long filename very long filename very long filename very long filename very long filename very long filename very long filename very long filename.jpg");
Assert.AreEqual(5, archive.Entries.Count);
Assert.IsTrue(archive.Entries.Any(entry => entry.Key == "very long filename/"));
Assert.IsTrue(archive.Entries.Any(entry => entry.Key == "very long filename/very long filename very long filename very long filename very long filename very long filename very long filename very long filename very long filename very long filename very long filename.jpg"));
Assert.IsTrue(archive.Entries.Any(entry => entry.Key == "z_file 1.txt"));
Assert.IsTrue(archive.Entries.Any(entry => entry.Key == "z_file 2.txt"));
Assert.IsTrue(archive.Entries.Any(entry => entry.Key == "z_file 3.txt"));
}
}

View File

@@ -169,11 +169,21 @@ namespace SharpCompress.Archive.Tar
{
var entry = new TarArchiveEntry(this, new TarFilePart(previousHeader, stream),
CompressionType.None);
var memoryStream = new MemoryStream();
entry.WriteTo(memoryStream);
memoryStream.Position = 0;
var bytes = memoryStream.ToArray();
header.Name = ArchiveEncoding.Default.GetString(bytes, 0, bytes.Length).TrimNulls();
var oldStreamPos = stream.Position;
using(var entryStream = entry.OpenEntryStream())
using(var memoryStream = new MemoryStream())
{
entryStream.TransferTo(memoryStream);
memoryStream.Position = 0;
var bytes = memoryStream.ToArray();
header.Name = ArchiveEncoding.Default.GetString(bytes, 0, bytes.Length).TrimNulls();
}
stream.Position = oldStreamPos;
previousHeader = null;
}
yield return new TarArchiveEntry(this, new TarFilePart(header, stream), CompressionType.None);