]> granicus.if.org Git - clang/commitdiff
Bitstream reader: Fix undefined behavior seen after rL364464
authorBjorn Pettersson <bjorn.a.pettersson@ericsson.com>
Fri, 5 Jul 2019 20:22:40 +0000 (20:22 +0000)
committerBjorn Pettersson <bjorn.a.pettersson@ericsson.com>
Fri, 5 Jul 2019 20:22:40 +0000 (20:22 +0000)
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

lib/Frontend/SerializedDiagnosticReader.cpp

index 045d757adbf8b35dcc2f001665d2f19c40b0d5cd..eca6f5ee180337ebc488eb46bcf6a27a877e6600 100644 (file)
@@ -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.");
     }
   }