diff options
author | Nikita Popov <npopov@redhat.com> | 2022-02-07 10:56:14 +0100 |
---|---|---|
committer | Nikita Popov <npopov@redhat.com> | 2022-02-07 12:16:12 +0100 |
commit | 3c86642edd28f1ce970882edaba8dce468ec7401 (patch) | |
tree | bd5f5ed9041363bea565873bd0052a291eb7ff34 /llvm/lib/Bitstream/Reader/BitstreamReader.cpp | |
parent | b8804557686f28fdcb3b9777552bb01be818035a (diff) | |
download | llvm-3c86642edd28f1ce970882edaba8dce468ec7401.zip llvm-3c86642edd28f1ce970882edaba8dce468ec7401.tar.gz llvm-3c86642edd28f1ce970882edaba8dce468ec7401.tar.bz2 |
[Bitstream] Reject implausibly large reservations
If we're trying to reserve more memory than bits in the stream,
reject this early to avoid OOM.
Diffstat (limited to 'llvm/lib/Bitstream/Reader/BitstreamReader.cpp')
-rw-r--r-- | llvm/lib/Bitstream/Reader/BitstreamReader.cpp | 4 |
1 files changed, 4 insertions, 0 deletions
diff --git a/llvm/lib/Bitstream/Reader/BitstreamReader.cpp b/llvm/lib/Bitstream/Reader/BitstreamReader.cpp index ffeb506..f924790 100644 --- a/llvm/lib/Bitstream/Reader/BitstreamReader.cpp +++ b/llvm/lib/Bitstream/Reader/BitstreamReader.cpp @@ -222,6 +222,8 @@ Expected<unsigned> BitstreamCursor::readRecord(unsigned AbbrevID, if (!MaybeNumElts) return MaybeNumElts.takeError(); uint32_t NumElts = MaybeNumElts.get(); + if (!isSizePlausible(NumElts)) + return error("Size is not plausible"); Vals.reserve(Vals.size() + NumElts); for (unsigned i = 0; i != NumElts; ++i) @@ -275,6 +277,8 @@ Expected<unsigned> BitstreamCursor::readRecord(unsigned AbbrevID, if (!MaybeNumElts) return MaybeNumElts.takeError(); uint32_t NumElts = MaybeNumElts.get(); + if (!isSizePlausible(NumElts)) + return error("Size is not plausible"); Vals.reserve(Vals.size() + NumElts); // Get the element encoding. |