summaryrefslogtreecommitdiffstats
path: root/clang/lib/Serialization/ModuleManager.cpp
diff options
context:
space:
mode:
authorBen Langmuir <blangmuir@apple.com>2014-05-01 03:33:36 +0000
committerBen Langmuir <blangmuir@apple.com>2014-05-01 03:33:36 +0000
commit05f82ba25225838749fa3029f77e91b546e44667 (patch)
tree73fd8ee2010c5e80fb871100f786005e5361a20f /clang/lib/Serialization/ModuleManager.cpp
parent7d6d2705f68d2540bc03682844ecb46f4513799d (diff)
downloadbcm5719-llvm-05f82ba25225838749fa3029f77e91b546e44667.tar.gz
bcm5719-llvm-05f82ba25225838749fa3029f77e91b546e44667.zip
Avoid a potential race between stat() and open() of ASTFile
We need to open an ASTFile while checking its expected size and modification time, or another clang instance can modify the file between the stat() and the open(). llvm-svn: 207735
Diffstat (limited to 'clang/lib/Serialization/ModuleManager.cpp')
-rw-r--r--clang/lib/Serialization/ModuleManager.cpp6
1 files changed, 5 insertions, 1 deletions
diff --git a/clang/lib/Serialization/ModuleManager.cpp b/clang/lib/Serialization/ModuleManager.cpp
index c36d902deb7..9b3159e1705 100644
--- a/clang/lib/Serialization/ModuleManager.cpp
+++ b/clang/lib/Serialization/ModuleManager.cpp
@@ -381,7 +381,9 @@ bool ModuleManager::lookupModuleFile(StringRef FileName,
off_t ExpectedSize,
time_t ExpectedModTime,
const FileEntry *&File) {
- File = FileMgr.getFile(FileName, /*openFile=*/false, /*cacheFailure=*/false);
+ // Open the file immediately to ensure there is no race between stat'ing and
+ // opening the file.
+ File = FileMgr.getFile(FileName, /*openFile=*/true, /*cacheFailure=*/false);
if (!File && FileName != "-") {
return false;
@@ -389,6 +391,8 @@ bool ModuleManager::lookupModuleFile(StringRef FileName,
if ((ExpectedSize && ExpectedSize != File->getSize()) ||
(ExpectedModTime && ExpectedModTime != File->getModificationTime())) {
+ FileMgr.invalidateCache(File);
+ File = nullptr;
return true;
}
OpenPOWER on IntegriCloud