diff --git a/SharpCompress.Test/Tar/TarArchiveTests.cs b/SharpCompress.Test/Tar/TarArchiveTests.cs index 259122c8..71a11e97 100644 --- a/SharpCompress.Test/Tar/TarArchiveTests.cs +++ b/SharpCompress.Test/Tar/TarArchiveTests.cs @@ -30,13 +30,33 @@ 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")); + } + } + + [TestMethod] + public void Tar_UstarArchivePathReadLongName() + { + string unmodified = Path.Combine(TEST_ARCHIVES_PATH, "ustar with long names.tar"); + using(var archive = TarArchive.Open(unmodified)) + { + Assert.AreEqual(6, archive.Entries.Count); + Assert.IsTrue(archive.Entries.Any(entry => entry.Key == "Directory/")); + Assert.IsTrue(archive.Entries.Any(entry => entry.Key == "Directory/Some file with veeeeeeeeeery loooooooooong name")); + Assert.IsTrue(archive.Entries.Any(entry => entry.Key == "Directory/Directory with veeeeeeeeeery loooooooooong name/")); + Assert.IsTrue(archive.Entries.Any(entry => entry.Key == "Directory/Directory with veeeeeeeeeery loooooooooong name/Some file with veeeeeeeeeery loooooooooong name")); + Assert.IsTrue(archive.Entries.Any(entry => entry.Key == "Directory/Directory with veeeeeeeeeery loooooooooong name/Directory with veeeeeeeeeery loooooooooong name/")); + Assert.IsTrue(archive.Entries.Any(entry => entry.Key == "Directory/Directory with veeeeeeeeeery loooooooooong name/Directory with veeeeeeeeeery loooooooooong name/Some file with veeeeeeeeeery loooooooooong name")); } } diff --git a/SharpCompress/Archive/Tar/TarArchive.cs b/SharpCompress/Archive/Tar/TarArchive.cs index e801854b..4258a37e 100644 --- a/SharpCompress/Archive/Tar/TarArchive.cs +++ b/SharpCompress/Archive/Tar/TarArchive.cs @@ -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); diff --git a/SharpCompress/Common/Tar/Headers/TarHeader.cs b/SharpCompress/Common/Tar/Headers/TarHeader.cs index 4e297957..5529f031 100644 --- a/SharpCompress/Common/Tar/Headers/TarHeader.cs +++ b/SharpCompress/Common/Tar/Headers/TarHeader.cs @@ -120,7 +120,7 @@ namespace SharpCompress.Common.Tar.Headers Magic = ArchiveEncoding.Default.GetString(buffer, 257, 6).TrimNulls(); - if (!string.IsNullOrEmpty(Magic) && "ustar ".Equals(Magic)) + if (!string.IsNullOrEmpty(Magic) && "ustar".Equals(Magic)) { string namePrefix = ArchiveEncoding.Default.GetString(buffer, 345, 157); namePrefix = namePrefix.TrimNulls(); diff --git a/TestArchives/Archives/ustar with long names.tar b/TestArchives/Archives/ustar with long names.tar new file mode 100644 index 00000000..35e96cdb Binary files /dev/null and b/TestArchives/Archives/ustar with long names.tar differ diff --git a/TestArchives/Archives/very long filename.tar b/TestArchives/Archives/very long filename.tar index fb4f0daa..d7abd2f1 100644 Binary files a/TestArchives/Archives/very long filename.tar and b/TestArchives/Archives/very long filename.tar differ