From 418c1256a8513a1c8f9c455fd0c4ae1ea0b84279 Mon Sep 17 00:00:00 2001 From: Sugita Akira Date: Wed, 14 Sep 2022 21:45:41 -0700 Subject: [PATCH] Ignores UnicodePathExtra if forced encoding is specified --- .../Zip/Headers/DirectoryEntryHeader.cs | 2 +- .../Common/Zip/Headers/LocalEntryHeader.cs | 2 +- .../SharpCompress.Test/Zip/ZipArchiveTests.cs | 32 ++++++++++++++++++ .../Archives/Zip.UnicodePathExtra.zip | Bin 0 -> 6895 bytes 4 files changed, 34 insertions(+), 2 deletions(-) create mode 100644 tests/TestArchives/Archives/Zip.UnicodePathExtra.zip diff --git a/src/SharpCompress/Common/Zip/Headers/DirectoryEntryHeader.cs b/src/SharpCompress/Common/Zip/Headers/DirectoryEntryHeader.cs index 57792e3f..8b55dcd6 100644 --- a/src/SharpCompress/Common/Zip/Headers/DirectoryEntryHeader.cs +++ b/src/SharpCompress/Common/Zip/Headers/DirectoryEntryHeader.cs @@ -55,7 +55,7 @@ namespace SharpCompress.Common.Zip.Headers LoadExtra(extra); var unicodePathExtra = Extra.FirstOrDefault(u => u.Type == ExtraDataType.UnicodePathExtraField); - if (unicodePathExtra != null) + if (unicodePathExtra != null && ArchiveEncoding.Forced == null) { Name = ((ExtraUnicodePathExtraField)unicodePathExtra).UnicodeName; } diff --git a/src/SharpCompress/Common/Zip/Headers/LocalEntryHeader.cs b/src/SharpCompress/Common/Zip/Headers/LocalEntryHeader.cs index 38f3a6f3..422ca6f4 100644 --- a/src/SharpCompress/Common/Zip/Headers/LocalEntryHeader.cs +++ b/src/SharpCompress/Common/Zip/Headers/LocalEntryHeader.cs @@ -45,7 +45,7 @@ namespace SharpCompress.Common.Zip.Headers LoadExtra(extra); var unicodePathExtra = Extra.FirstOrDefault(u => u.Type == ExtraDataType.UnicodePathExtraField); - if (unicodePathExtra != null) + if (unicodePathExtra != null && ArchiveEncoding.Forced == null) { Name = ((ExtraUnicodePathExtraField)unicodePathExtra).UnicodeName; } diff --git a/tests/SharpCompress.Test/Zip/ZipArchiveTests.cs b/tests/SharpCompress.Test/Zip/ZipArchiveTests.cs index eb85da5e..4ad7e7db 100644 --- a/tests/SharpCompress.Test/Zip/ZipArchiveTests.cs +++ b/tests/SharpCompress.Test/Zip/ZipArchiveTests.cs @@ -754,5 +754,37 @@ namespace SharpCompress.Test.Zip Assert.Equal(4, x); } } + + [Fact] + public void Zip_Forced_Ignores_UnicodePathExtra() + { + var zipPath = Path.Combine(TEST_ARCHIVES_PATH, "Zip.UnicodePathExtra.zip"); + using (var stream = File.Open(zipPath, FileMode.Open, FileAccess.Read)) + { + IArchive archive = ArchiveFactory.Open(stream, new ReaderOptions + { + ArchiveEncoding = new ArchiveEncoding + { + Default = Encoding.GetEncoding("shift_jis"), + } + }); + IReader reader = archive.ExtractAllEntries(); + reader.MoveToNextEntry(); + Assert.Equal("궖귛궖귙귪궖귗귪궖귙_wav.frq", reader.Entry.Key); + } + using (var stream = File.Open(zipPath, FileMode.Open, FileAccess.Read)) + { + IArchive archive = ArchiveFactory.Open(stream, new ReaderOptions + { + ArchiveEncoding = new ArchiveEncoding + { + Forced = Encoding.GetEncoding("shift_jis"), + } + }); + IReader reader = archive.ExtractAllEntries(); + reader.MoveToNextEntry(); + Assert.Equal("きょきゅんきゃんきゅ_wav.frq", reader.Entry.Key); + } + } } } diff --git a/tests/TestArchives/Archives/Zip.UnicodePathExtra.zip b/tests/TestArchives/Archives/Zip.UnicodePathExtra.zip new file mode 100644 index 0000000000000000000000000000000000000000..e716a6b67da4313922972c9ced5880b560ac772f GIT binary patch literal 6895 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