diff options
Diffstat (limited to 'src/google')
-rw-r--r-- | src/google/protobuf/compiler/command_line_interface.cc | 3 | ||||
-rw-r--r-- | src/google/protobuf/compiler/importer.cc | 17 | ||||
-rw-r--r-- | src/google/protobuf/compiler/importer_unittest.cc | 12 |
3 files changed, 30 insertions, 2 deletions
diff --git a/src/google/protobuf/compiler/command_line_interface.cc b/src/google/protobuf/compiler/command_line_interface.cc index ea8c4ab2..089844f4 100644 --- a/src/google/protobuf/compiler/command_line_interface.cc +++ b/src/google/protobuf/compiler/command_line_interface.cc @@ -93,7 +93,8 @@ static const char* kPathSeparator = ":"; #endif // Returns true if the text looks like a Windows-style absolute path, starting -// with a drive letter. Example: "C:\foo". +// with a drive letter. Example: "C:\foo". TODO(kenton): Share this with +// copy in importer.cc? static bool IsWindowsAbsolutePath(const string& text) { #if defined(_WIN32) || defined(__CYGWIN__) return text.size() >= 3 && text[1] == ':' && diff --git a/src/google/protobuf/compiler/importer.cc b/src/google/protobuf/compiler/importer.cc index a0d8164a..30e106e8 100644 --- a/src/google/protobuf/compiler/importer.cc +++ b/src/google/protobuf/compiler/importer.cc @@ -61,6 +61,20 @@ namespace compiler { #endif #endif +// Returns true if the text looks like a Windows-style absolute path, starting +// with a drive letter. Example: "C:\foo". TODO(kenton): Share this with +// copy in command_line_interface.cc? +static bool IsWindowsAbsolutePath(const string& text) { +#if defined(_WIN32) || defined(__CYGWIN__) + return text.size() >= 3 && text[1] == ':' && + isalpha(text[0]) && + (text[2] == '/' || text[2] == '\\') && + text.find_last_of(':') == 1; +#else + return false; +#endif +} + MultiFileErrorCollector::~MultiFileErrorCollector() {} // This class serves two purposes: @@ -276,7 +290,8 @@ static bool ApplyMapping(const string& filename, // We do not allow the file name to use "..". return false; } - if (HasPrefixString(filename, "/")) { + if (HasPrefixString(filename, "/") || + IsWindowsAbsolutePath(filename)) { // This is an absolute path, so it isn't matched by the empty string. return false; } diff --git a/src/google/protobuf/compiler/importer_unittest.cc b/src/google/protobuf/compiler/importer_unittest.cc index 173a3373..51aeb90c 100644 --- a/src/google/protobuf/compiler/importer_unittest.cc +++ b/src/google/protobuf/compiler/importer_unittest.cc @@ -516,6 +516,18 @@ TEST_F(DiskSourceTreeTest, DiskFileToVirtualFileCanonicalization) { source_tree_.DiskFileToVirtualFile( "../../baz", &virtual_file, &shadowing_disk_file)); + // "/foo" is not mapped (it should not be misintepreted as being under "."). + EXPECT_EQ(DiskSourceTree::NO_MAPPING, + source_tree_.DiskFileToVirtualFile( + "/foo", &virtual_file, &shadowing_disk_file)); + +#ifdef WIN32 + // "C:\foo" is not mapped (it should not be misintepreted as being under "."). + EXPECT_EQ(DiskSourceTree::NO_MAPPING, + source_tree_.DiskFileToVirtualFile( + "C:\\foo", &virtual_file, &shadowing_disk_file)); +#endif // WIN32 + // But "../baz" should be. EXPECT_EQ(DiskSourceTree::CANNOT_OPEN, source_tree_.DiskFileToVirtualFile( |