From 65a19e18d7d4b94f50772bd3118c0b9868766af5 Mon Sep 17 00:00:00 2001 From: Maryam Ariyan 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(() => ZipFile.ExtractToDirectory(archivePath, destination.FullName)); + } + [Fact] public void CreatedEmptyDirectoriesRoundtrip() {