summaryrefslogtreecommitdiffstats
path: root/chrome/common/extensions/extension_resource.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/common/extensions/extension_resource.cc')
-rw-r--r--chrome/common/extensions/extension_resource.cc28
1 files changed, 21 insertions, 7 deletions
diff --git a/chrome/common/extensions/extension_resource.cc b/chrome/common/extensions/extension_resource.cc
index 7b2a833..6c1cff6 100644
--- a/chrome/common/extensions/extension_resource.cc
+++ b/chrome/common/extensions/extension_resource.cc
@@ -41,21 +41,35 @@ FilePath ExtensionResource::GetFilePath(const FilePath& extension_root,
extension_l10n_util::GetL10nRelativePaths(relative_path,
&l10n_relative_paths);
+ // We need to resolve the parent references in the extension_root
+ // path on its own because IsParent doesn't like parent references.
+ FilePath clean_extension_root(extension_root);
+ if (!file_util::AbsolutePath(&clean_extension_root))
+ return FilePath();
+
// Stat l10n file(s), and return new path if it exists.
for (size_t i = 0; i < l10n_relative_paths.size(); ++i) {
- FilePath full_path;
- if (extension_root.AppendAndResolveRelative(l10n_relative_paths[i],
- &full_path) &&
- extension_root.IsParent(full_path) &&
+ FilePath full_path = clean_extension_root.Append(l10n_relative_paths[i]);
+ if (file_util::AbsolutePath(&full_path) &&
+ clean_extension_root.IsParent(full_path) &&
file_util::PathExists(full_path)) {
return full_path;
}
}
// Fall back to root resource.
- FilePath full_path;
- if (extension_root.AppendAndResolveRelative(relative_path, &full_path) &&
- extension_root.IsParent(full_path)) {
+ FilePath full_path = clean_extension_root.Append(relative_path);
+
+ // We must resolve the absolute path of the combined path when
+ // the relative path contains references to a parent folder (i.e., '..').
+ // We also check if the path exists because the posix version of AbsolutePath
+ // will fail if the path doesn't exist, and we want the same behavior on
+ // Windows... So until the posix and Windows version of AbsolutePath are
+ // unified, we need an extra call to PathExists, unfortunately.
+ // TODO(mad): Fix this once AbsolutePath is unified.
+ if (file_util::AbsolutePath(&full_path) &&
+ file_util::PathExists(full_path) &&
+ clean_extension_root.IsParent(full_path)) {
return full_path;
}