From ed9825848281163a14c55f48def81b6e04ef7ffe Mon Sep 17 00:00:00 2001 From: Ben Langmuir Date: Sat, 8 Nov 2014 00:34:30 +0000 Subject: Check module signature when the module has already been loaded We may need to verify the signature on subsequent imports as well, just like we verify the size/modtime: @import A; @import B; // imports A @import C; // imports A llvm-svn: 221569 --- clang/lib/Serialization/ModuleManager.cpp | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) (limited to 'clang/lib/Serialization/ModuleManager.cpp') diff --git a/clang/lib/Serialization/ModuleManager.cpp b/clang/lib/Serialization/ModuleManager.cpp index 3baaa0a4b28..b5ee4145020 100644 --- a/clang/lib/Serialization/ModuleManager.cpp +++ b/clang/lib/Serialization/ModuleManager.cpp @@ -132,21 +132,27 @@ ModuleManager::addModule(StringRef FileName, ModuleKind Type, // Initialize the stream New->StreamFile.init((const unsigned char *)New->Buffer->getBufferStart(), (const unsigned char *)New->Buffer->getBufferEnd()); + } + + if (ExpectedSignature) { + if (NewModule) + ModuleEntry->Signature = ReadSignature(ModuleEntry->StreamFile); + else + assert(ModuleEntry->Signature == ReadSignature(ModuleEntry->StreamFile)); - if (ExpectedSignature) { - New->Signature = ReadSignature(New->StreamFile); - if (New->Signature != ExpectedSignature) { - ErrorStr = New->Signature ? "signature mismatch" - : "could not read module signature"; + if (ModuleEntry->Signature != ExpectedSignature) { + ErrorStr = ModuleEntry->Signature ? "signature mismatch" + : "could not read module signature"; + if (NewModule) { // Remove the module file immediately, since removeModules might try to // invalidate the file cache for Entry, and that is not safe if this // module is *itself* up to date, but has an out-of-date importer. Modules.erase(Entry); Chain.pop_back(); - delete New; - return OutOfDate; + delete ModuleEntry; } + return OutOfDate; } } -- cgit v1.2.3