diff options
-rw-r--r-- | third_party/zlib/google/zip.cc | 6 | ||||
-rw-r--r-- | third_party/zlib/google/zip_unittest.cc | 18 |
2 files changed, 22 insertions, 2 deletions
diff --git a/third_party/zlib/google/zip.cc b/third_party/zlib/google/zip.cc index a7bcc3c..d1ba74f 100644 --- a/third_party/zlib/google/zip.cc +++ b/third_party/zlib/google/zip.cc @@ -51,8 +51,10 @@ bool AddFileToZip(zipFile zip_file, const base::FilePath& src_dir) { bool AddEntryToZip(zipFile zip_file, const base::FilePath& path, const base::FilePath& root_path) { - std::string str_path = - path.AsUTF8Unsafe().substr(root_path.AsUTF8Unsafe().length() + 1); + base::FilePath relative_path; + bool result = root_path.AppendRelativePath(path, &relative_path); + DCHECK(result); + std::string str_path = relative_path.AsUTF8Unsafe(); #if defined(OS_WIN) ReplaceSubstringsAfterOffset(&str_path, 0u, "\\", "/"); #endif diff --git a/third_party/zlib/google/zip_unittest.cc b/third_party/zlib/google/zip_unittest.cc index 0572b85..1023705 100644 --- a/third_party/zlib/google/zip_unittest.cc +++ b/third_party/zlib/google/zip_unittest.cc @@ -174,6 +174,24 @@ TEST_F(ZipTest, ZipIgnoreHidden) { TestUnzipFile(zip_file, false); } +TEST_F(ZipTest, ZipNonASCIIDir) { + base::FilePath src_dir; + ASSERT_TRUE(GetTestDataDirectory(&src_dir)); + src_dir = src_dir.AppendASCII("test"); + + base::ScopedTempDir temp_dir; + ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); + // Append 'Тест' (in cyrillic). + base::FilePath src_dir_russian = + temp_dir.path().Append(base::FilePath::FromUTF8Unsafe( + "\xD0\xA2\xD0\xB5\xD1\x81\xD1\x82")); + base::CopyDirectory(src_dir, src_dir_russian, true); + base::FilePath zip_file = temp_dir.path().AppendASCII("out_russian.zip"); + + EXPECT_TRUE(zip::Zip(src_dir_russian, zip_file, true)); + TestUnzipFile(zip_file, true); +} + #if defined(OS_POSIX) TEST_F(ZipTest, ZipFiles) { base::FilePath src_dir; |