| |
@@ -0,0 +1,53 @@
|
| |
+ From 65a19e18d7d4b94f50772bd3118c0b9868766af5 Mon Sep 17 00:00:00 2001
|
| |
+ From: Maryam Ariyan <maryam.ariyan@microsoft.com>
|
| |
+ Date: Fri, 7 Sep 2018 10:53:25 -0700
|
| |
+ Subject: [PATCH] Fixes extract out of directory by ensuring trailing separator
|
| |
+ for nested paths.
|
| |
+
|
| |
+ Related to PR #32127
|
| |
+ ---
|
| |
+ .../System/IO/Compression/ZipFileExtensions.cs | 2 ++
|
| |
+ .../tests/ZipFileConvenienceMethods.cs | 17 +++++++++++++++++
|
| |
+ 2 files changed, 19 insertions(+)
|
| |
+
|
| |
+ diff --git a/src/System.IO.Compression.ZipFile/src/System/IO/Compression/ZipFileExtensions.cs b/src/System.IO.Compression.ZipFile/src/System/IO/Compression/ZipFileExtensions.cs
|
| |
+ index 3fef7883c953..c749c8250f9c 100644
|
| |
+ --- a/src/System.IO.Compression.ZipFile/src/System/IO/Compression/ZipFileExtensions.cs
|
| |
+ +++ b/src/System.IO.Compression.ZipFile/src/System/IO/Compression/ZipFileExtensions.cs
|
| |
+ @@ -160,6 +160,8 @@ public static void ExtractToDirectory(this ZipArchive source, string destination
|
| |
+ // Note that this will give us a good DirectoryInfo even if destinationDirectoryName exists:
|
| |
+ DirectoryInfo di = Directory.CreateDirectory(destinationDirectoryName);
|
| |
+ string destinationDirectoryFullPath = di.FullName;
|
| |
+ + if (!destinationDirectoryFullPath.EndsWith(Path.DirectorySeparatorChar))
|
| |
+ + destinationDirectoryFullPath += Path.DirectorySeparatorChar;
|
| |
+
|
| |
+ foreach (ZipArchiveEntry entry in source.Entries)
|
| |
+ {
|
| |
+ diff --git a/src/System.IO.Compression.ZipFile/tests/ZipFileConvenienceMethods.cs b/src/System.IO.Compression.ZipFile/tests/ZipFileConvenienceMethods.cs
|
| |
+ index 69c822e3fc7e..3a0255d03862 100644
|
| |
+ --- a/src/System.IO.Compression.ZipFile/tests/ZipFileConvenienceMethods.cs
|
| |
+ +++ b/src/System.IO.Compression.ZipFile/tests/ZipFileConvenienceMethods.cs
|
| |
+ @@ -186,6 +186,23 @@ public void ExtractToDirectoryExtension_Unicode()
|
| |
+ }
|
| |
+ }
|
| |
+
|
| |
+ + [Theory]
|
| |
+ + [InlineData("../Foo")]
|
| |
+ + [InlineData("../Barbell")]
|
| |
+ + [SkipOnTargetFramework(TargetFrameworkMonikers.NetFramework, "Second case fails.")]
|
| |
+ + public void ExtractOutOfRoot(string entryName)
|
| |
+ + {
|
| |
+ + string archivePath = GetTestFilePath();
|
| |
+ + using (FileStream stream = new FileStream(archivePath, FileMode.Create))
|
| |
+ + using (ZipArchive archive = new ZipArchive(stream, ZipArchiveMode.Create, leaveOpen: true))
|
| |
+ + {
|
| |
+ + ZipArchiveEntry entry = archive.CreateEntry(entryName);
|
| |
+ + }
|
| |
+ +
|
| |
+ + DirectoryInfo destination = Directory.CreateDirectory(Path.Combine(GetTestFilePath(), "Bar"));
|
| |
+ + Assert.Throws<IOException>(() => ZipFile.ExtractToDirectory(archivePath, destination.FullName));
|
| |
+ + }
|
| |
+ +
|
| |
+ [Fact]
|
| |
+ public void CreatedEmptyDirectoriesRoundtrip()
|
| |
+ {
|
| |