aboutsummaryrefslogtreecommitdiff
path: root/clang/lib/Basic/VirtualFileSystem.cpp
diff options
context:
space:
mode:
authorVolodymyr Sapsai <vsapsai@apple.com>2018-08-07 19:05:41 +0000
committerVolodymyr Sapsai <vsapsai@apple.com>2018-08-07 19:05:41 +0000
commit3b2f6a4b29c92c4d4fafe4964ad164f600608f28 (patch)
tree6f8e4b0f2c233853b33e1cd00bb16d831748d708 /clang/lib/Basic/VirtualFileSystem.cpp
parent98dbbfd85182ec275b102e8d283bd6e4a375bc42 (diff)
downloadllvm-3b2f6a4b29c92c4d4fafe4964ad164f600608f28.zip
llvm-3b2f6a4b29c92c4d4fafe4964ad164f600608f28.tar.gz
llvm-3b2f6a4b29c92c4d4fafe4964ad164f600608f28.tar.bz2
[VFS] Emit an error when entry at root level uses a relative path.
Entries with only a filename prevent us from building a file system tree and cause the assertion > Assertion failed: (NewParentE && "Parent entry must exist"), function uniqueOverlayTree, file clang/lib/Basic/VirtualFileSystem.cpp, line 1303. Entries with a relative path are simply not discoverable during header search. rdar://problem/28990865 Reviewers: bruno, benlangmuir Reviewed By: bruno Subscribers: dexonsmith, cfe-commits Differential Revision: https://reviews.llvm.org/D49518 llvm-svn: 339164
Diffstat (limited to 'clang/lib/Basic/VirtualFileSystem.cpp')
-rw-r--r--clang/lib/Basic/VirtualFileSystem.cpp18
1 files changed, 15 insertions, 3 deletions
diff --git a/clang/lib/Basic/VirtualFileSystem.cpp b/clang/lib/Basic/VirtualFileSystem.cpp
index a7b8b02..c0cf48d 100644
--- a/clang/lib/Basic/VirtualFileSystem.cpp
+++ b/clang/lib/Basic/VirtualFileSystem.cpp
@@ -1281,7 +1281,8 @@ class RedirectingFileSystemParser {
}
}
- std::unique_ptr<Entry> parseEntry(yaml::Node *N, RedirectingFileSystem *FS) {
+ std::unique_ptr<Entry> parseEntry(yaml::Node *N, RedirectingFileSystem *FS,
+ bool IsRootEntry) {
auto *M = dyn_cast<yaml::MappingNode>(N);
if (!M) {
error(N, "expected mapping node for file or directory entry");
@@ -1302,6 +1303,7 @@ class RedirectingFileSystemParser {
std::vector<std::unique_ptr<Entry>> EntryArrayContents;
std::string ExternalContentsPath;
std::string Name;
+ yaml::Node *NameValueNode;
auto UseExternalName = RedirectingFileEntry::NK_NotSet;
EntryKind Kind;
@@ -1321,6 +1323,7 @@ class RedirectingFileSystemParser {
if (!parseScalarString(I.getValue(), Value, Buffer))
return nullptr;
+ NameValueNode = I.getValue();
if (FS->UseCanonicalizedPaths) {
SmallString<256> Path(Value);
// Guarantee that old YAML files containing paths with ".." and "."
@@ -1357,7 +1360,8 @@ class RedirectingFileSystemParser {
}
for (auto &I : *Contents) {
- if (std::unique_ptr<Entry> E = parseEntry(&I, FS))
+ if (std::unique_ptr<Entry> E =
+ parseEntry(&I, FS, /*IsRootEntry*/ false))
EntryArrayContents.push_back(std::move(E));
else
return nullptr;
@@ -1418,6 +1422,13 @@ class RedirectingFileSystemParser {
return nullptr;
}
+ if (IsRootEntry && !sys::path::is_absolute(Name)) {
+ assert(NameValueNode && "Name presence should be checked earlier");
+ error(NameValueNode,
+ "entry with relative path at the root level is not discoverable");
+ return nullptr;
+ }
+
// Remove trailing slash(es), being careful not to remove the root path
StringRef Trimmed(Name);
size_t RootPathLen = sys::path::root_path(Trimmed).size();
@@ -1500,7 +1511,8 @@ public:
}
for (auto &I : *Roots) {
- if (std::unique_ptr<Entry> E = parseEntry(&I, FS))
+ if (std::unique_ptr<Entry> E =
+ parseEntry(&I, FS, /*IsRootEntry*/ true))
RootEntries.push_back(std::move(E));
else
return false;