aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Bitstream/Reader/BitstreamReader.cpp
diff options
context:
space:
mode:
authorNikita Popov <npopov@redhat.com>2022-02-07 10:56:14 +0100
committerNikita Popov <npopov@redhat.com>2022-02-07 12:16:12 +0100
commit3c86642edd28f1ce970882edaba8dce468ec7401 (patch)
treebd5f5ed9041363bea565873bd0052a291eb7ff34 /llvm/lib/Bitstream/Reader/BitstreamReader.cpp
parentb8804557686f28fdcb3b9777552bb01be818035a (diff)
downloadllvm-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.cpp4
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.