summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--chrome/browser/net/url_fixer_upper.cc6
-rw-r--r--chrome/browser/net/url_fixer_upper_unittest.cc7
2 files changed, 12 insertions, 1 deletions
diff --git a/chrome/browser/net/url_fixer_upper.cc b/chrome/browser/net/url_fixer_upper.cc
index 37125d0..4d85b42 100644
--- a/chrome/browser/net/url_fixer_upper.cc
+++ b/chrome/browser/net/url_fixer_upper.cc
@@ -538,8 +538,12 @@ GURL URLFixerUpper::FixupRelativeFile(const FilePath& base_dir,
PrepareStringForFileOps(text, &trimmed);
bool is_file = true;
+ // Avoid recognizing definite non-file URLs as file paths.
+ GURL gurl(trimmed);
+ if (gurl.is_valid() && gurl.IsStandard())
+ is_file = false;
FilePath full_path;
- if (!ValidPathForFile(trimmed, &full_path)) {
+ if (is_file && !ValidPathForFile(trimmed, &full_path)) {
// Not a path as entered, try unescaping it in case the user has
// escaped things. We need to go through 8-bit since the escaped values
// only represent 8-bit values.
diff --git a/chrome/browser/net/url_fixer_upper_unittest.cc b/chrome/browser/net/url_fixer_upper_unittest.cc
index f49ea8f..abe248f 100644
--- a/chrome/browser/net/url_fixer_upper_unittest.cc
+++ b/chrome/browser/net/url_fixer_upper_unittest.cc
@@ -516,4 +516,11 @@ TEST(URLFixerUpperTest, FixupRelativeFile) {
// done with the subdir
EXPECT_TRUE(file_util::Delete(full_path, false));
EXPECT_TRUE(file_util::Delete(new_dir, true));
+
+ // Test that an obvious HTTP URL isn't accidentally treated as an absolute
+ // file path (on account of system-specific craziness).
+ FilePath empty_path;
+ FilePath http_url_path(FILE_PATH_LITERAL("http://../"));
+ EXPECT_TRUE(URLFixerUpper::FixupRelativeFile(
+ empty_path, http_url_path).SchemeIs("http"));
}