Frontend: Disentangle removePathTraversal from concatenating paths

This reimplements part of r211303 in a bit of a cleaner way. Doing so
allows us to use a proper absolute path when calling addFileMapping
rather than relying on a substring being one, which should fix the
tests on Windows.

llvm-svn: 211338
This commit is contained in:
Justin Bogner 2014-06-20 03:28:46 +00:00
parent 2800a3770d
commit e1552f6648
1 changed files with 15 additions and 8 deletions

View File

@ -57,13 +57,14 @@ void ModuleDependencyCollector::writeFileMap() {
VFSWriter.write(OS);
}
/// Append the absolute path in Nested to the path given by Root. This will
/// remove directory traversal from the resulting nested path.
static void appendNestedPath(SmallVectorImpl<char> &Root, StringRef Nested) {
/// Remove traversal (ie, . or ..) from the given absolute path.
static void removePathTraversal(SmallVectorImpl<char> &Path) {
using namespace llvm::sys;
SmallVector<StringRef, 16> ComponentStack;
StringRef P(Path.data(), Path.size());
StringRef Rel = path::relative_path(Nested);
// Skip the root path, then look for traversal in the components.
StringRef Rel = path::relative_path(P);
for (StringRef C : llvm::make_range(path::begin(Rel), path::end(Rel))) {
if (C == ".")
continue;
@ -73,9 +74,14 @@ static void appendNestedPath(SmallVectorImpl<char> &Root, StringRef Nested) {
} else
ComponentStack.push_back(C);
}
// The stack is now the path without any directory traversal.
SmallString<256> Buffer = path::root_path(P);
for (StringRef C : ComponentStack)
path::append(Root, C);
path::append(Buffer, C);
// Put the result in Path.
Path.swap(Buffer);
}
std::error_code ModuleDependencyListener::copyToRoot(StringRef Src) {
@ -84,10 +90,11 @@ std::error_code ModuleDependencyListener::copyToRoot(StringRef Src) {
// We need an absolute path to append to the root.
SmallString<256> AbsoluteSrc = Src;
fs::make_absolute(AbsoluteSrc);
removePathTraversal(AbsoluteSrc);
// Build the destination path.
SmallString<256> Dest = Collector.getDest();
size_t RootLen = Dest.size();
appendNestedPath(Dest, AbsoluteSrc);
path::append(Dest, path::relative_path(AbsoluteSrc));
// Copy the file into place.
if (std::error_code EC = fs::create_directories(path::parent_path(Dest),
@ -96,7 +103,7 @@ std::error_code ModuleDependencyListener::copyToRoot(StringRef Src) {
if (std::error_code EC = fs::copy_file(AbsoluteSrc.str(), Dest.str()))
return EC;
// Use the absolute path under the root for the file mapping.
Collector.addFileMapping(Dest.substr(RootLen), Dest.str());
Collector.addFileMapping(AbsoluteSrc.str(), Dest.str());
return std::error_code();
}