Skip to content

Commit e11ae05

Browse files
committed
Fix logic error when deserializing input file
* Also add a check for absolute paths in `isPathInStableDir`
1 parent 9847c59 commit e11ae05

File tree

2 files changed

+45
-15
lines changed

2 files changed

+45
-15
lines changed

clang/lib/Serialization/ASTReader.cpp

Lines changed: 38 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2616,6 +2616,18 @@ bool ASTReader::shouldDisableValidationForFile(
26162616
return false;
26172617
}
26182618

2619+
namespace {
2620+
2621+
std::pair<StringRef, StringRef>
2622+
getUnresolvedInputFilenames(const ASTReader::RecordData &Record,
2623+
const StringRef InputBlob) {
2624+
uint16_t AsRequestedLength = Record[7];
2625+
return {InputBlob.substr(0, AsRequestedLength),
2626+
InputBlob.substr(AsRequestedLength)};
2627+
}
2628+
2629+
} // namespace
2630+
26192631
InputFileInfo ASTReader::getInputFileInfo(ModuleFile &F, unsigned ID) {
26202632
// If this ID is bogus, just return an empty input file.
26212633
if (ID == 0 || ID > F.InputFileInfosLoaded.size())
@@ -2659,11 +2671,12 @@ InputFileInfo ASTReader::getInputFileInfo(ModuleFile &F, unsigned ID) {
26592671
R.Transient = static_cast<bool>(Record[4]);
26602672
R.TopLevel = static_cast<bool>(Record[5]);
26612673
R.ModuleMap = static_cast<bool>(Record[6]);
2662-
uint16_t AsRequestedLength = Record[7];
2663-
R.UnresolvedImportedFilenameAsRequested = Blob.substr(0, AsRequestedLength);
2664-
R.UnresolvedImportedFilename = Blob.substr(AsRequestedLength);
2665-
if (R.UnresolvedImportedFilename.empty())
2666-
R.UnresolvedImportedFilename = R.UnresolvedImportedFilenameAsRequested;
2674+
auto [UnresolvedFilenameAsRequested, UnresolvedFilename] =
2675+
getUnresolvedInputFilenames(Record, Blob);
2676+
R.UnresolvedImportedFilenameAsRequested = UnresolvedFilenameAsRequested;
2677+
R.UnresolvedImportedFilename = UnresolvedFilename.empty()
2678+
? UnresolvedFilenameAsRequested
2679+
: UnresolvedFilename;
26672680

26682681
Expected<llvm::BitstreamEntry> MaybeEntry = Cursor.advance();
26692682
if (!MaybeEntry) // FIXME this drops errors on the floor.
@@ -5834,13 +5847,27 @@ bool ASTReader::readASTFileControlBlock(
58345847
break;
58355848
case INPUT_FILE:
58365849
bool Overridden = static_cast<bool>(Record[3]);
5837-
const size_t FilenameAsRequestedLength = Record[7] + 1;
5838-
auto ResolvedFilenameAsRequested = ResolveImportedPath(
5839-
PathBuf, Blob.substr(0, FilenameAsRequestedLength), ModuleDir);
5840-
StringRef ExternalFilename = Blob.substr(FilenameAsRequestedLength);
5850+
5851+
auto [UnresolvedFilenameAsRequested, UnresolvedFilename] =
5852+
getUnresolvedInputFilenames(Record, Blob);
5853+
TemporarilyOwnedStringRef ResolvedFilenameAsRequested =
5854+
ResolveImportedPath(PathBuf, UnresolvedFilenameAsRequested,
5855+
ModuleDir);
5856+
const std::string ResolvedFilenameAsRequestedStr =
5857+
ResolvedFilenameAsRequested->str();
5858+
5859+
std::string ResolvedFilenameStr;
5860+
if (!UnresolvedFilename.empty()) {
5861+
SmallString<0> FilenameBuf;
5862+
FilenameBuf.reserve(256);
5863+
auto ResolvedFilename =
5864+
ResolveImportedPath(FilenameBuf, UnresolvedFilename, ModuleDir);
5865+
ResolvedFilenameStr = ResolvedFilename->str();
5866+
}
5867+
58415868
shouldContinue = Listener.visitInputFile(
5842-
ResolvedFilenameAsRequested->str(), ExternalFilename,
5843-
isSystemFile, Overridden,
5869+
ResolvedFilenameAsRequestedStr, ResolvedFilenameStr, isSystemFile,
5870+
Overridden,
58445871
/*IsExplicitModule=*/false);
58455872
break;
58465873
}

clang/lib/Tooling/DependencyScanning/ModuleDepCollector.cpp

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -226,11 +226,14 @@ void dependencies::resetBenignCodeGenOptions(frontend::ActionKind ProgramAction,
226226

227227
bool dependencies::isPathInStableDir(const ArrayRef<StringRef> Directories,
228228
const StringRef Input) {
229+
using namespace llvm::sys;
230+
231+
if (!path::is_absolute(Input))
232+
return false;
233+
229234
auto PathStartsWith = [](StringRef Prefix, StringRef Path) {
230-
auto PrefixIt = llvm::sys::path::begin(Prefix),
231-
PrefixEnd = llvm::sys::path::end(Prefix);
232-
for (auto PathIt = llvm::sys::path::begin(Path),
233-
PathEnd = llvm::sys::path::end(Path);
235+
auto PrefixIt = path::begin(Prefix), PrefixEnd = path::end(Prefix);
236+
for (auto PathIt = path::begin(Path), PathEnd = path::end(Path);
234237
PrefixIt != PrefixEnd && PathIt != PathEnd; ++PrefixIt, ++PathIt) {
235238
if (*PrefixIt != *PathIt)
236239
return false;

0 commit comments

Comments
 (0)