From: Bjorn Pettersson Date: Fri, 5 Jul 2019 20:22:40 +0000 (+0000) Subject: Bitstream reader: Fix undefined behavior seen after rL364464 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=53d7df893da0ef1ea384934e0b8d3f6ae555cb93;p=clang 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 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@365239 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Frontend/SerializedDiagnosticReader.cpp b/lib/Frontend/SerializedDiagnosticReader.cpp index 045d757adb..eca6f5ee18 100644 --- a/lib/Frontend/SerializedDiagnosticReader.cpp +++ b/lib/Frontend/SerializedDiagnosticReader.cpp @@ -124,7 +124,12 @@ SerializedDiagnosticReader::skipUntilRecordOrBlock( else return llvm::errorToErrorCode(Res.takeError()); - switch ((llvm::bitc::FixedAbbrevIDs)Code) { + if (Code >= static_cast(llvm::bitc::FIRST_APPLICATION_ABBREV)) { + // We found a record. + BlockOrRecordID = Code; + return Cursor::Record; + } + switch (static_cast(Code)) { case llvm::bitc::ENTER_SUBBLOCK: if (Expected 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."); } }