arc-setup: Fix permission is not always set correctly.

This fixes issue when permission is not always correctly copied for GMS
Core caches. app_chimera subfolder has 771 original permissions but in
case of cache setup it has 751 permissions.

BUG=b:79209220
TEST=Update unit test to catch this case,
     crrev.com/i/620308 + cheets_CacheValidationServer

Change-Id: I0dcc929c007de0d8844dde6ae0b6a7ad38c1aad8
Reviewed-on: https://chromium-review.googlesource.com/1043077
Commit-Ready: Yury Khmel <khmel@google.com>
Tested-by: Yury Khmel <khmel@google.com>
Reviewed-by: Yusuke Sato <yusukes@chromium.org>
(cherry picked from commit ba606ca580ee3ce24044e089ee10467cfd7fd07f)
Reviewed-on: https://chromium-review.googlesource.com/1081030
Reviewed-by: Yury Khmel <khmel@google.com>
Commit-Queue: Yury Khmel <khmel@google.com>
Trybot-Ready: Yury Khmel <khmel@google.com>
diff --git a/arc/setup/arc_setup_util.cc b/arc/setup/arc_setup_util.cc
index be3ff7d..2f224ef 100644
--- a/arc/setup/arc_setup_util.cc
+++ b/arc/setup/arc_setup_util.cc
@@ -1122,6 +1122,12 @@
         PLOG(ERROR) << "Failed to set onwers " << target_path.value();
         return false;
       }
+
+      if (fchmodat(dirfd.get(), target_base_name.c_str(), from_stat.st_mode,
+                   0 /* flags */) < 0) {
+        PLOG(ERROR) << "Failed to set permissions " << target_path.value();
+        return false;
+      }
     } else if (S_ISREG(from_stat.st_mode)) {
       base::ScopedFD fd_read(open(current.value().c_str(), O_RDONLY));
       if (!fd_read.is_valid()) {
diff --git a/arc/setup/arc_setup_util_unittest.cc b/arc/setup/arc_setup_util_unittest.cc
index d761e53..6b8e831 100644
--- a/arc/setup/arc_setup_util_unittest.cc
+++ b/arc/setup/arc_setup_util_unittest.cc
@@ -895,7 +895,7 @@
   const base::FilePath from_fifo = from_sub_dir1.Append("fifo");
 
   EXPECT_TRUE(InstallDirectory(0751, kTestUid, kTestGid, from_path));
-  EXPECT_TRUE(InstallDirectory(0711, kTestUid, kTestGid, from_sub_dir1));
+  EXPECT_TRUE(InstallDirectory(0771, kTestUid, kTestGid, from_sub_dir1));
   EXPECT_TRUE(InstallDirectory(0700, kTestUid, kTestGid, from_sub_dir2));
   EXPECT_TRUE(WriteToFile(from_test_file, 0660, "testme"));
   EXPECT_TRUE(base::CreateSymbolicLink(from_test_file, from_test_link));