forked from OSchip/llvm-project
Bitstream reader: Fix undefined behavior seen after rL364464
Summary: After rL364464 the following tests started to fail when running the clang-doc tests with an ubsan instrumented build of clang-doc: Clang Tools :: clang-doc/single-file-public.cpp Extra Tools Unit Tests :: clang-doc/./ClangDocTests/BitcodeTest.emitEnumInfoBitcode Extra Tools Unit Tests :: clang-doc/./ClangDocTests/BitcodeTest.emitMethodInfoBitcode Extra Tools Unit Tests :: clang-doc/./ClangDocTests/BitcodeTest.emitRecordInfoBitcode Extra Tools Unit Tests :: clang-doc/./ClangDocTests/SerializeTest.emitInfoWithCommentBitcode We need to check that the read value is in range for being casted to the llvm::bitc::FixedAbbrevIDs enum, before the cast in ClangDocBitcodeReader::skipUntilRecordOrBlock. SerializedDiagnosticReader::skipUntilRecordOrBlock was updated in the same way. Reviewers: jfb Reviewed By: jfb Subscribers: Bigcheese, vsapsai, bruno, ilya-biryukov, dexonsmith, kadircet, cfe-commits Tags: #clang Differential Revision: https://reviews.llvm.org/D64262 llvm-svn: 365239
This commit is contained in:
parent
28e0187175
commit
009225374a
|
@ -615,10 +615,12 @@ ClangDocBitcodeReader::skipUntilRecordOrBlock(unsigned &BlockOrRecordID) {
|
|||
return Cursor::BadBlock;
|
||||
}
|
||||
|
||||
// FIXME check that the enum is in range.
|
||||
auto Code = static_cast<llvm::bitc::FixedAbbrevIDs>(MaybeCode.get());
|
||||
|
||||
switch (Code) {
|
||||
unsigned Code = MaybeCode.get();
|
||||
if (Code >= static_cast<unsigned>(llvm::bitc::FIRST_APPLICATION_ABBREV)) {
|
||||
BlockOrRecordID = Code;
|
||||
return Cursor::Record;
|
||||
}
|
||||
switch (static_cast<llvm::bitc::FixedAbbrevIDs>(Code)) {
|
||||
case llvm::bitc::ENTER_SUBBLOCK:
|
||||
if (Expected<unsigned> MaybeID = Stream.ReadSubBlockID())
|
||||
BlockOrRecordID = MaybeID.get();
|
||||
|
@ -639,9 +641,8 @@ ClangDocBitcodeReader::skipUntilRecordOrBlock(unsigned &BlockOrRecordID) {
|
|||
continue;
|
||||
case llvm::bitc::UNABBREV_RECORD:
|
||||
return Cursor::BadBlock;
|
||||
default:
|
||||
BlockOrRecordID = Code;
|
||||
return Cursor::Record;
|
||||
case llvm::bitc::FIRST_APPLICATION_ABBREV:
|
||||
llvm_unreachable("Unexpected abbrev id.");
|
||||
}
|
||||
}
|
||||
llvm_unreachable("Premature stream end.");
|
||||
|
|
|
@ -124,7 +124,12 @@ SerializedDiagnosticReader::skipUntilRecordOrBlock(
|
|||
else
|
||||
return llvm::errorToErrorCode(Res.takeError());
|
||||
|
||||
switch ((llvm::bitc::FixedAbbrevIDs)Code) {
|
||||
if (Code >= static_cast<unsigned>(llvm::bitc::FIRST_APPLICATION_ABBREV)) {
|
||||
// We found a record.
|
||||
BlockOrRecordID = Code;
|
||||
return Cursor::Record;
|
||||
}
|
||||
switch (static_cast<llvm::bitc::FixedAbbrevIDs>(Code)) {
|
||||
case llvm::bitc::ENTER_SUBBLOCK:
|
||||
if (Expected<unsigned> Res = Stream.ReadSubBlockID())
|
||||
BlockOrRecordID = Res.get();
|
||||
|
@ -145,10 +150,8 @@ SerializedDiagnosticReader::skipUntilRecordOrBlock(
|
|||
case llvm::bitc::UNABBREV_RECORD:
|
||||
return SDError::UnsupportedConstruct;
|
||||
|
||||
default:
|
||||
// We found a record.
|
||||
BlockOrRecordID = Code;
|
||||
return Cursor::Record;
|
||||
case llvm::bitc::FIRST_APPLICATION_ABBREV:
|
||||
llvm_unreachable("Unexpected abbrev id.");
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue