From 2e533f9fb5f2668eb2a092bff0a33ca8cd05a7fe Mon Sep 17 00:00:00 2001
From: Strachu
Date: Mon, 15 Dec 2014 21:13:57 +0100
Subject: [PATCH 1/2] Fixed handling of ustar tar files with long names.
---
SharpCompress.Test/Tar/TarArchiveTests.cs | 16 ++++++++++++++++
SharpCompress/Common/Tar/Headers/TarHeader.cs | 2 +-
TestArchives/Archives/ustar with long names.tar | Bin 0 -> 5632 bytes
3 files changed, 17 insertions(+), 1 deletion(-)
create mode 100644 TestArchives/Archives/ustar with long names.tar
diff --git a/SharpCompress.Test/Tar/TarArchiveTests.cs b/SharpCompress.Test/Tar/TarArchiveTests.cs
index 259122c8..3cbd6998 100644
--- a/SharpCompress.Test/Tar/TarArchiveTests.cs
+++ b/SharpCompress.Test/Tar/TarArchiveTests.cs
@@ -40,6 +40,22 @@ namespace SharpCompress.Test
}
}
+ [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"));
+ }
+ }
+
[TestMethod]
public void Tar_Create_New()
{
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 0000000000000000000000000000000000000000..35e96cdba2c99bc3a6f5ed18681a95e5cf83767c
GIT binary patch
literal 5632
zcmZ?CEJ{r-$uFu@D9oP0RQOIOHC%uUq~&d*I%NXyJgB~Cp92pAX`
zn3^V(oAbyT3nJ?#9&}h
zTvC*noKcF?IzsXgpMX3EVkt1d0~V)=gF?a$6qU*Oc_pcNC0v8TMWc?OX9&QPsXm-V
zT+Y@f-jxOh2Il6bpsax-{~H(}<$rSp10z!ta}x#yQ{t^4UnQ;bKlv`At4>m5oi63S
ziMhF<$#5zENzGVvjedsF@}IupJ=km`HUE>U9^_xr%71YC&&Kl^c-_%gSz|h19RQ`|F|D=XA>FN>jPfpEFoP8ws|BOtHOiYJ({ZCxb47jS%
W`hUQqVAKJlAut*OqaiRLApiiSOi2L%
literal 0
HcmV?d00001
From 8fcb0cb7a2f7f5f197c588c5b1773eddd4e944f6 Mon Sep 17 00:00:00 2001
From: Strachu
Date: Tue, 16 Dec 2014 11:11:02 +0100
Subject: [PATCH 2/2] Fixed bug causing entries of non-ustar archive being
after one with very long name to be discarded
---
SharpCompress.Test/Tar/TarArchiveTests.cs | 10 +++++++---
SharpCompress/Archive/Tar/TarArchive.cs | 20 ++++++++++++++-----
TestArchives/Archives/very long filename.tar | Bin 43520 -> 46592 bytes
3 files changed, 22 insertions(+), 8 deletions(-)
diff --git a/SharpCompress.Test/Tar/TarArchiveTests.cs b/SharpCompress.Test/Tar/TarArchiveTests.cs
index 3cbd6998..71a11e97 100644
--- a/SharpCompress.Test/Tar/TarArchiveTests.cs
+++ b/SharpCompress.Test/Tar/TarArchiveTests.cs
@@ -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"));
}
}
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/TestArchives/Archives/very long filename.tar b/TestArchives/Archives/very long filename.tar
index fb4f0daa0e0c22fc0d434f82e0688dd07f45cde2..d7abd2f109c5c17e035e558a5ca48f60865d3271 100644
GIT binary patch
delta 233
zcmZp;!qo7FX+oEfxv8n40)y%1gG-Yc7cnj2sftg_%t=)+)GMhd
znYb`watf1zq=JIEf}s&am!YY#f`WpXk*SFSg8^6