summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--third_party/zlib/google/zip.cc6
-rw-r--r--third_party/zlib/google/zip_unittest.cc18
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;