[Frontend] Return an error on bad inputs to PrecompiledPreabmle
Summary: Instead of failing with assertions. Fixes a crash found by oss-fuzz: https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=12865 Reviewers: sammccall Reviewed By: sammccall Subscribers: cfe-commits Tags: #clang Differential Revision: https://reviews.llvm.org/D62137 llvm-svn: 361376
This commit is contained in:
parent
9b40dd6318
commit
2917526f29
|
@ -291,7 +291,8 @@ enum class BuildPreambleError {
|
|||
CouldntCreateTempFile = 1,
|
||||
CouldntCreateTargetInfo,
|
||||
BeginSourceFileFailed,
|
||||
CouldntEmitPCH
|
||||
CouldntEmitPCH,
|
||||
BadInputs
|
||||
};
|
||||
|
||||
class BuildPreambleErrorCategory final : public std::error_category {
|
||||
|
|
|
@ -1368,6 +1368,7 @@ ASTUnit::getMainBufferWithPrecompiledPreamble(
|
|||
case BuildPreambleError::CouldntCreateTargetInfo:
|
||||
case BuildPreambleError::BeginSourceFileFailed:
|
||||
case BuildPreambleError::CouldntEmitPCH:
|
||||
case BuildPreambleError::BadInputs:
|
||||
// These erros are more likely to repeat, retry after some period.
|
||||
PreambleRebuildCountdown = DefaultPreambleRebuildInterval;
|
||||
return nullptr;
|
||||
|
|
|
@ -299,14 +299,13 @@ llvm::ErrorOr<PrecompiledPreamble> PrecompiledPreamble::Build(
|
|||
// created. This complexity should be lifted elsewhere.
|
||||
Clang->getTarget().adjust(Clang->getLangOpts());
|
||||
|
||||
assert(Clang->getFrontendOpts().Inputs.size() == 1 &&
|
||||
"Invocation must have exactly one source file!");
|
||||
assert(Clang->getFrontendOpts().Inputs[0].getKind().getFormat() ==
|
||||
InputKind::Source &&
|
||||
"FIXME: AST inputs not yet supported here!");
|
||||
assert(Clang->getFrontendOpts().Inputs[0].getKind().getLanguage() !=
|
||||
InputKind::LLVM_IR &&
|
||||
"IR inputs not support here!");
|
||||
if (Clang->getFrontendOpts().Inputs.size() != 1 ||
|
||||
Clang->getFrontendOpts().Inputs[0].getKind().getFormat() !=
|
||||
InputKind::Source ||
|
||||
Clang->getFrontendOpts().Inputs[0].getKind().getLanguage() ==
|
||||
InputKind::LLVM_IR) {
|
||||
return BuildPreambleError::BadInputs;
|
||||
}
|
||||
|
||||
// Clear out old caches and data.
|
||||
Diagnostics.Reset();
|
||||
|
@ -784,6 +783,8 @@ std::string BuildPreambleErrorCategory::message(int condition) const {
|
|||
return "BeginSourceFile() return an error";
|
||||
case BuildPreambleError::CouldntEmitPCH:
|
||||
return "Could not emit PCH";
|
||||
case BuildPreambleError::BadInputs:
|
||||
return "Command line arguments must contain exactly one source file";
|
||||
}
|
||||
llvm_unreachable("unexpected BuildPreambleError");
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue