| OLD | NEW |
| 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "components/policy/core/common/cloud/resource_cache.h" | 5 #include "components/policy/core/common/cloud/resource_cache.h" |
| 6 | 6 |
| 7 #include "base/base64.h" | 7 #include "base/base64.h" |
| 8 #include "base/callback.h" | 8 #include "base/callback.h" |
| 9 #include "base/file_util.h" | 9 #include "base/file_util.h" |
| 10 #include "base/files/file_enumerator.h" | 10 #include "base/files/file_enumerator.h" |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 78 // cache directory. The mechanism is meant to foil file-system-level attacks | 78 // cache directory. The mechanism is meant to foil file-system-level attacks |
| 79 // where a symlink is planted in the cache directory before Chrome has | 79 // where a symlink is planted in the cache directory before Chrome has |
| 80 // started. An attacker controlling a process running concurrently with Chrome | 80 // started. An attacker controlling a process running concurrently with Chrome |
| 81 // would be able to race against the protection by re-creating the symlink | 81 // would be able to race against the protection by re-creating the symlink |
| 82 // between these two calls. There is nothing in file_util that could be used | 82 // between these two calls. There is nothing in file_util that could be used |
| 83 // to protect against such races, especially as the cache is cross-platform | 83 // to protect against such races, especially as the cache is cross-platform |
| 84 // and therefore cannot use any POSIX-only tricks. | 84 // and therefore cannot use any POSIX-only tricks. |
| 85 int size = base::checked_cast<int>(data.size()); | 85 int size = base::checked_cast<int>(data.size()); |
| 86 return VerifyKeyPathAndGetSubkeyPath(key, true, subkey, &subkey_path) && | 86 return VerifyKeyPathAndGetSubkeyPath(key, true, subkey, &subkey_path) && |
| 87 base::DeleteFile(subkey_path, false) && | 87 base::DeleteFile(subkey_path, false) && |
| 88 (file_util::WriteFile(subkey_path, data.data(), size) == size); | 88 (base::WriteFile(subkey_path, data.data(), size) == size); |
| 89 } | 89 } |
| 90 | 90 |
| 91 bool ResourceCache::Load(const std::string& key, | 91 bool ResourceCache::Load(const std::string& key, |
| 92 const std::string& subkey, | 92 const std::string& subkey, |
| 93 std::string* data) { | 93 std::string* data) { |
| 94 DCHECK(task_runner_->RunsTasksOnCurrentThread()); | 94 DCHECK(task_runner_->RunsTasksOnCurrentThread()); |
| 95 base::FilePath subkey_path; | 95 base::FilePath subkey_path; |
| 96 // Only read from |subkey_path| if it is not a symlink. | 96 // Only read from |subkey_path| if it is not a symlink. |
| 97 if (!VerifyKeyPathAndGetSubkeyPath(key, false, subkey, &subkey_path) || | 97 if (!VerifyKeyPathAndGetSubkeyPath(key, false, subkey, &subkey_path) || |
| 98 base::IsLink(subkey_path)) { | 98 base::IsLink(subkey_path)) { |
| (...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 232 if (!VerifyKeyPath(key, allow_create_key, &key_path) || | 232 if (!VerifyKeyPath(key, allow_create_key, &key_path) || |
| 233 !Base64Encode(subkey, &encoded)) { | 233 !Base64Encode(subkey, &encoded)) { |
| 234 return false; | 234 return false; |
| 235 } | 235 } |
| 236 *path = key_path.AppendASCII(encoded); | 236 *path = key_path.AppendASCII(encoded); |
| 237 return true; | 237 return true; |
| 238 } | 238 } |
| 239 | 239 |
| 240 | 240 |
| 241 } // namespace policy | 241 } // namespace policy |
| OLD | NEW |