diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/google/protobuf/compiler/importer.cc | 10 | ||||
-rw-r--r-- | src/google/protobuf/compiler/importer_unittest.cc | 7 |
2 files changed, 16 insertions, 1 deletions
diff --git a/src/google/protobuf/compiler/importer.cc b/src/google/protobuf/compiler/importer.cc index 61182933..62089cdc 100644 --- a/src/google/protobuf/compiler/importer.cc +++ b/src/google/protobuf/compiler/importer.cc @@ -280,10 +280,18 @@ static bool ApplyMapping(const string& filename, // Not an exact match. Is the next character a '/'? Otherwise, // this isn't actually a match at all. E.g. the prefix "foo/bar" // does not match the filename "foo/barbaz". + int after_prefix_start = -1; if (filename[old_prefix.size()] == '/') { + after_prefix_start = old_prefix.size() + 1; + } else if (filename[old_prefix.size() - 1] == '/') { + // old_prefix is never empty, and canonicalized paths never have + // consecutive '/' characters. + after_prefix_start = old_prefix.size(); + } + if (after_prefix_start != -1) { // Yep. So the prefixes are directories and the filename is a file // inside them. - string after_prefix = filename.substr(old_prefix.size() + 1); + string after_prefix = filename.substr(after_prefix_start); if (ContainsParentReference(after_prefix)) { // We do not allow the file name to use "..". return false; diff --git a/src/google/protobuf/compiler/importer_unittest.cc b/src/google/protobuf/compiler/importer_unittest.cc index 5b5d2831..55c52e47 100644 --- a/src/google/protobuf/compiler/importer_unittest.cc +++ b/src/google/protobuf/compiler/importer_unittest.cc @@ -492,6 +492,7 @@ TEST_F(DiskSourceTreeTest, DiskFileToVirtualFileCanonicalization) { source_tree_.MapPath("dir3", "./foo/bar/."); source_tree_.MapPath("dir4", "."); source_tree_.MapPath("", "/qux"); + source_tree_.MapPath("dir5", "/quux/"); string virtual_file; string shadowing_disk_file; @@ -530,6 +531,12 @@ TEST_F(DiskSourceTreeTest, DiskFileToVirtualFileCanonicalization) { source_tree_.DiskFileToVirtualFile( "/qux/baz", &virtual_file, &shadowing_disk_file)); EXPECT_EQ("baz", virtual_file); + + // "/quux/bar" is under "/quux". + EXPECT_EQ(DiskSourceTree::CANNOT_OPEN, + source_tree_.DiskFileToVirtualFile( + "/quux/bar", &virtual_file, &shadowing_disk_file)); + EXPECT_EQ("dir5/bar", virtual_file); } } // namespace |