[PATCH] D46942: Make sure getCanonicalName returns absolute paths even on VFS.

Eric Liu via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Wed May 16 06:52:58 PDT 2018


ioeric created this revision.
ioeric added a reviewer: bkramer.
Herald added a subscriber: cfe-commits.

Generally, canonical paths are expected to be absolute. This is the
behavior for Windows build. But for unix, it might return relative paths when
failing to resolve real path (e.g. unsupported symlink on VFS).


Repository:
  rC Clang

https://reviews.llvm.org/D46942

Files:
  lib/Basic/FileManager.cpp
  unittests/Basic/FileManagerTest.cpp


Index: unittests/Basic/FileManagerTest.cpp
===================================================================
--- unittests/Basic/FileManagerTest.cpp
+++ unittests/Basic/FileManagerTest.cpp
@@ -322,4 +322,35 @@
   EXPECT_EQ(Path, ExpectedResult);
 }
 
+TEST_F(FileManagerTest, GetCanonicalNameReturnsAbsolutePathOnVFS) {
+  SmallString<64> CustomWorkingDir;
+#ifdef _WIN32
+  CustomWorkingDir = "C:\\test";
+#else
+  CustomWorkingDir = "/test";
+#endif
+  llvm::sys::path::append(CustomWorkingDir, "some", "weird", "path");
+
+  auto FS =
+      IntrusiveRefCntPtr<vfs::InMemoryFileSystem>(new vfs::InMemoryFileSystem);
+  // setCurrentworkingdirectory must finish without error.
+  ASSERT_TRUE(!FS->setCurrentWorkingDirectory(CustomWorkingDir));
+  SmallString<64> FooPath("weird/foo/foo.cpp");
+  FS->addFile(FooPath.str(), 0, llvm::MemoryBuffer::getMemBuffer(""));
+
+  FileSystemOptions Opts;
+  FileManager Manager(Opts, FS);
+
+  // Use relative path to open the directory.
+  const DirectoryEntry *Dir =
+      Manager.getDirectory(llvm::sys::path::parent_path(FooPath.str()));
+  EXPECT_TRUE(Dir != nullptr);
+  EXPECT_FALSE(llvm::sys::path::is_absolute(Dir->getName()));
+
+  SmallString<64> AbsFooPath(CustomWorkingDir);
+  llvm::sys::path::append(AbsFooPath, FooPath);
+  EXPECT_EQ(Manager.getCanonicalName(Dir),
+            llvm::sys::path::parent_path(AbsFooPath.str()));
+}
+
 } // anonymous namespace
Index: lib/Basic/FileManager.cpp
===================================================================
--- lib/Basic/FileManager.cpp
+++ lib/Basic/FileManager.cpp
@@ -532,15 +532,17 @@
   if (Known != CanonicalDirNames.end())
     return Known->second;
 
-  StringRef CanonicalName(Dir->getName());
+  // Canonical name should still be an absolute path even if realpath fails.
+  llvm::SmallString<128> AbsDirPath(Dir->getName());
+  makeAbsolutePath(AbsDirPath);
+  StringRef CanonicalName = AbsDirPath.str().copy(CanonicalNameStorage);
 
 #ifdef LLVM_ON_UNIX
   char CanonicalNameBuf[PATH_MAX];
-  if (realpath(Dir->getName().str().c_str(), CanonicalNameBuf))
+  if (realpath(AbsDirPath.c_str(), CanonicalNameBuf))
     CanonicalName = StringRef(CanonicalNameBuf).copy(CanonicalNameStorage);
 #else
   SmallString<256> CanonicalNameBuf(CanonicalName);
-  llvm::sys::fs::make_absolute(CanonicalNameBuf);
   llvm::sys::path::native(CanonicalNameBuf);
   // We've run into needing to remove '..' here in the wild though, so
   // remove it.


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D46942.147076.patch
Type: text/x-patch
Size: 2456 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20180516/87fb69de/attachment.bin>


More information about the cfe-commits mailing list