diff options
| -rw-r--r-- | llvm/lib/Bitcode/Reader/BitcodeReader.cpp | 9 | ||||
| -rw-r--r-- | llvm/test/Bitcode/Inputs/invalid-bitwidth.bc | bin | 0 -> 224 bytes | |||
| -rw-r--r-- | llvm/test/Bitcode/invalid.test | 6 |
3 files changed, 13 insertions, 2 deletions
diff --git a/llvm/lib/Bitcode/Reader/BitcodeReader.cpp b/llvm/lib/Bitcode/Reader/BitcodeReader.cpp index c3589bce398..0af344ab557 100644 --- a/llvm/lib/Bitcode/Reader/BitcodeReader.cpp +++ b/llvm/lib/Bitcode/Reader/BitcodeReader.cpp @@ -950,12 +950,17 @@ std::error_code BitcodeReader::ParseTypeTableBody() { case bitc::TYPE_CODE_X86_MMX: // X86_MMX ResultTy = Type::getX86_MMXTy(Context); break; - case bitc::TYPE_CODE_INTEGER: // INTEGER: [width] + case bitc::TYPE_CODE_INTEGER: { // INTEGER: [width] if (Record.size() < 1) return Error("Invalid record"); - ResultTy = IntegerType::get(Context, Record[0]); + uint64_t NumBits = Record[0]; + if (NumBits < IntegerType::MIN_INT_BITS || + NumBits > IntegerType::MAX_INT_BITS) + return Error("Bitwidth for integer type out of range"); + ResultTy = IntegerType::get(Context, NumBits); break; + } case bitc::TYPE_CODE_POINTER: { // POINTER: [pointee type] or // [pointee type, address space] if (Record.size() < 1) diff --git a/llvm/test/Bitcode/Inputs/invalid-bitwidth.bc b/llvm/test/Bitcode/Inputs/invalid-bitwidth.bc Binary files differnew file mode 100644 index 00000000000..e9028f71e5f --- /dev/null +++ b/llvm/test/Bitcode/Inputs/invalid-bitwidth.bc diff --git a/llvm/test/Bitcode/invalid.test b/llvm/test/Bitcode/invalid.test index 19ef3267cc6..3eaa0394dba 100644 --- a/llvm/test/Bitcode/invalid.test +++ b/llvm/test/Bitcode/invalid.test @@ -6,8 +6,14 @@ RUN: not llvm-dis -disable-output %p/Inputs/invalid-unexpected-eof.bc 2>&1 | \ RUN: FileCheck --check-prefix=UNEXPECTED-EOF %s RUN: not llvm-dis -disable-output %p/Inputs/invalid-bad-abbrev-number.bc 2>&1 | \ RUN: FileCheck --check-prefix=BAD-ABBREV-NUMBER %s +RUN: not llvm-dis -disable-output %p/Inputs/invalid-type-table-forward-ref.bc 2>&1 | \ +RUN: FileCheck --check-prefix=BAD-TYPE-TABLE-FORWARD-REF %s +RUN: not llvm-dis -disable-output %p/Inputs/invalid-bitwidth.bc 2>&1 | \ +RUN: FileCheck --check-prefix=BAD-BITWIDTH %s INVALID-ENCODING: Invalid encoding BAD-ABBREV: Abbreviation starts with an Array or a Blob UNEXPECTED-EOF: Unexpected end of file BAD-ABBREV-NUMBER: Invalid abbrev number +BAD-TYPE-TABLE-FORWARD-REF: Invalid TYPE table: Only named structs can be forward referenced +BAD-BITWIDTH: Bitwidth for integer type out of range |

