Skip to content

Commit d1ad463

Browse files
committed
[cc1depscan_main] Fix use-after-free when a scan daemon is used and its diagnostic output is used
This was found when building with ASAN enabled, the `CAS/depscan-with-error.c` test fails. rdar://136931134
1 parent d2e1960 commit d1ad463

File tree

1 file changed

+7
-3
lines changed

1 file changed

+7
-3
lines changed

clang/tools/driver/cc1depscan_main.cpp

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -369,7 +369,7 @@ static Expected<llvm::cas::CASID> scanAndUpdateCC1InlineWithTool(
369369
static llvm::Expected<llvm::cas::CASID> scanAndUpdateCC1UsingDaemon(
370370
const char *Exec, ArrayRef<const char *> OldArgs,
371371
StringRef WorkingDirectory, SmallVectorImpl<const char *> &NewArgs,
372-
StringRef &DiagnosticOutput, StringRef Path,
372+
std::string &DiagnosticOutput, StringRef Path,
373373
const DepscanSharing &Sharing,
374374
llvm::function_ref<const char *(const Twine &)> SaveArg,
375375
llvm::cas::ObjectStore &CAS) {
@@ -396,9 +396,13 @@ static llvm::Expected<llvm::cas::CASID> scanAndUpdateCC1UsingDaemon(
396396
CC1DepScanDProtocol::ResultKind Result;
397397
StringRef FailedReason;
398398
StringRef RootID;
399+
StringRef DiagOut;
399400
if (auto E = Comms.getScanResult(Saver, Result, FailedReason, RootID,
400-
RawNewArgs, DiagnosticOutput))
401+
RawNewArgs, DiagOut)) {
402+
DiagnosticOutput = DiagOut;
401403
return std::move(E);
404+
}
405+
DiagnosticOutput = DiagOut;
402406

403407
if (Result != CC1DepScanDProtocol::SuccessResult)
404408
return llvm::createStringError(llvm::inconvertibleErrorCode(),
@@ -503,7 +507,7 @@ static int scanAndUpdateCC1(const char *Exec, ArrayRef<const char *> OldArgs,
503507
if (ProduceIncludeTree)
504508
Sharing.CASArgs.push_back("-fdepscan-include-tree");
505509

506-
StringRef DiagnosticOutput;
510+
std::string DiagnosticOutput;
507511
bool DiagnosticErrorOccurred = false;
508512
auto ScanAndUpdate = [&]() {
509513
if (std::optional<std::string> DaemonPath =

0 commit comments

Comments
 (0)